WordPressのフックの種類にあるフィルターフックの使い方を、アクションフックの使い方を覚えた後に理解してみました。
WordPressのコアを直接いじることなく何かアレンジを加えたい場合など、カスタマイズしたい手段の一つとしてフィルターフックを使用できます。
WordPressのフィルターフックとは何か?
WordPressのフィルターフックとは、データベースやブラウザに追加される処理の途中で、フィルターする関数をフックに追加して引っ掛けることができる機能のことを言います。
- フィルターはWordPress本体やプラグインが何かを出力したり、操作したりするときに、その出力や操作に手を加えることができるもの。
- フックは、フィルターで何かを出力したり、操作したりするときに、その出力や操作に手を加えたものをフックで引っ掛けておくことです。
簡単に言うと、WordPressの出力や操作に手を加えたいものを作成して登録する方法の一つとして使用できるのがWordPressのフィルターフックです。
「フィルターするものをフックする」とイメージするようにすると理解しやすいと思います。
フィルターフックの使い方
「フィルターするものをフックする」
WordPressのフィルターフックで「何をフィルターするもの」として「どのようフックする」使い方すればいいのか?それを理解できるのはWordPressのadd_filter関数の使い方を理解しておく必要があります。
add_filterはフィルターフックで実行する関数を関数名で登録できるコード作成ができます。
add_filterでフィルターフックする使い方を理解してしまいましょう。
add_filterの使い方
<?php add_filter( $tag, $function_to_add, $priority, $accepted_args ); ?>
WordPressのcodexでフィルターフックをするためのadd_filterのコードを確認すると上記のコードが紹介されています。
add_filterの使い方としては、この上記のコードとフィルターフックする関数を作成したセットにする使い方をします。
function 関数 {
//フィルターが適用されるときの処理
return $value; //引数に受け取った値($value)を加工して返すか変更後の値を返す
}
add_filter( フック名, 関数名, 優先順位, 引数の数 );
記述はadd_filterを関数の下で指定して記述してもいいですし、上に記述して指定してもどちらでも大丈夫です。
そしてadd_filter();のカッコの中にパラメータが入ります。add_filterのパラメータは4つあります。
add_filterのパラメータの使い方
add_filterのパラメータの使い方ですが、パラメータはフィルターフックに登録するフック名、関数名、優先順位、引数の数を指定できます。
<?php add_filter( $tag, $function_to_add, $priority, $accepted_args ); ?>
<?php add_filter( フック名, 関数名, 優先順位, 引数の数 ); ?>
add_filterのパラメータの指定が必須なのは、第一引数の「$tag」と第二引数の「$function_to_add」です。
$tag:フック名を指定します。
第一引数に指定したフックをどこかのタイミングで実行させます。
どこかのタイミングと言うのは、WordPressで用意されているフィルターフック一覧でフィルターフックする場所を目的に応じて探すことができます。
$function_to_add:関数名を指定します。
第二引数で指定するのは自分で作成する関数やメソッドです。指定しないと作成した関数の実行はなされません。
関数=処理と考えて理解してしまうといいと思います。
$priority:優先順位を指定します。
関数を実行する順序を指定しておくパラメータです。同じフィルターに複数のフックが定義されていた場合の実行順序で、数値が小さいほど早く実行できます。もし同じ数値の場合なら追加された順で実行になります。
$accepted_args:引数の数を指定します。関数で使用する引数の数を指定します。
フィルターフック関数の使い方
実際にフィルターフック関数を作成して理解した方が早いかもしれないです。
WordPressのフィルターフックの使い方でフィルターフック関数の使い方を実際にコードを書いて理解したいだけなので、今回は簡単なフィルターフック関数にしてみようと思います。
the_titleにフィルターフックする関数
試しにフィルターフックでWordPressの投稿タイトルを星で囲んでみます。投稿のときに投稿タイトルブロックで★を入力すればいいだけなので実用性はないですが、フィルターフックの使い方を理解するための練習として。
add_filter('the_title', 'con_title',10,2);
function con_title($title){
return '★ '.$title.' ★';
}
add_filter() を使ってthe_titleフィルターに登録する関数を指定してから、第二引数で指定する文字列を関数名にします。
そして、WordPressの投稿タイトルを★で囲みたいので、PHPのreturnで、引数に受け取った投稿タイトルの$titleを加工して返します。
これで作成したフィルターフック関数がthe_titleにフックされて、apply_filtersで実行されます
理解に苦しんだ部分がありました。フックに指定しているthe_titleというのは、テンプレート関数などで使われているthe_titleの関数とは完全な別物なようですね。あくまでもフックの名前という理解の仕方が正しいらしいです。
この辺を理解するためにはWordPressのコアファイルを覗くのが早いです。
wp-includesに収められたWordPressのPHP群の中wp-includes/default-filters.phpを見てます。
// wp-includes/default-filters.php
add_filter( 'the_title', 'wptexturize' );
add_filter( 'the_title', 'convert_chars' );
add_filter( 'the_title', 'trim' );
// wp-includes/post-template.php
function get_the_title( $post = 0 ) {
return apply_filters( 'the_title', $title, $id );
}
既にフィルターフックがwp-includesの中に関数やメソッドが登録されいます。そしてフィルターフックの実行(apply_filters)の記述もあります。
ということは、コアの段階でフックの実行がされているということが理解できます。
こう考えてみると、フィルターフックはWordPressコアでフックしてる仲間に加えてもらうことで、そのフックグループのメンバーになるということなのでしょうね。
the_contentにフィルターフックする関数
WordPressの投稿コンテンツの上部に表示する要素をフィルターフックでフックする関数もやってみました。
WordPressの投稿コンテンツは、the_contentにフィルターフックできるので、the_contentにフィルターフックする関数を作成です。
add_filter( 'the_content', 'z_con' );
function z_con($content) {
return '<div>フィルターフックした要素</div>' .$content;
}
add_filter() を使ってthe_contentフィルターに登録する関数を指定してから、第二引数で指定する文字列を関数名にします。
そして、引数に受け取った本文の$contentを加工して返します。
WordPressの投稿ページで、コンテンツ上部に表示する要素を表示したい内容を記述した後ろに$contentも指定し、PHPのreturnで返します。
関数の引数で使用した$contentは、投稿コンテンツを表示するための変数です。それなのでreturnで$contentも返さないと「コンテンツ上部に表示する要素を表示したい内容」しか表示できません。
実行された結果は上の画像になります。わかりやすいように背景色と位置と余白だけCSSで調整してます。
ところでフィルターフック関数を作成したときに使ったreturnって、確か使い回し効くのではなかったかな?
PHPは詳しくないのですが、何事も行動。投稿コンテンツの下部にフィルターフック関数を作成した関数名で出力してみます。
<?php echo z_con($content); ?>
なるほど。このようにしてフィルターフック関数は使い回しも効くということが理解できました。
フィルターフックの登録と実行を理解する
WordPressのフィルターフックの使い方を理解しようとしているわけですが、記事の中でフィルターフックの「登録」とか「実行」が出てきました。
最初、WordPressのフィルターフックの使い方を理解しようとしてたとき、add_filterで登録も実行も可能なのだと思っていました。これは理解の仕方を間違えていたようで、フィルターフックの登録と実行は別なのですね。
add_filterでフィルターフックの登録
add_filterがフィルターフックで関数を登録です。
言い方を変えればWordPressのフィルターフックの使い方を理解しようとしている私たちは、フィルターフックを作成した関数の登録をする使い方を理解しようとしているのですね。
細かいことまでは理解できていませんが「add_filterでフィルターフックの登録をする」と覚えておくことにします。
apply_filtersでフィルターフックの実行
apply_filtersでフィルターフックの実行をします。登録したフィルターフックの実行ですね。
フィルターフックの実行(apply_filters)は返り値を戻すことで実行されます。
フィルターフックの登録と実行の流れをイメージすると以下になります。
- フックの登録(add_filter、add_action)
- フックの実行(apply_filters、do_action)
という手順を踏んで初めてフィルターフックが実行されます。add_filterはapply_filters() 関数を経由して出力するのだと理解できます。
add_actionとdo_actionもありますが、これはadd_filterのエイリアスとしてWordPressのcodexで説明がある「アクションフック」の登録と実行です。
アクションフックの使い方についてはWordPressのアクションフックの使い方を覚えたくて投稿した記事があるので読んでみてください。
まとめ
WordPressのフィルターフックの使い方を理解するための投稿でしたが、それぞれカスタマイズしたいところをWordPressのフィルターフック一覧で探したり、テーマ内のテンプレートファイル内のaplly_filterを探せば、テーマのテンプレートファイルを変更せずにカスタマイズすることができます。
私がフィルターフックの使い方で難しいと思ったのは、フィルターフックで登録するときの関数の作り方でした。
やっぱりPHPの勉強するべきだな…WordPressは趣味でやってるだけなんですけどね。