WordPressといったCMSは独自にカスタマイズできることが大きなメリットです。オリジナルのPHPファイルを追加したり、プラグインを導入して自分だけのWEBサイトを作れるようになります。
WordPressを使っていれば、テンプレートは配布されているものでも、独自でプログラムを書いてカスタマイズをしようと思ったことのある人は多いと思います。
初めのうちは検索して見つけたプログラムをコピペして、functions.phpにぶち込んでいる人も多いでしょう。そのコードをよくみると、add_action(...)やadd_filter(...)といった関数がよく使われていることがわかります。
今回はこの2つの関数の説明と違いをサンプルを使いながら解説します。
目次
サンプルコードを用意
function example_func ($a = "shiro", $b = "goma") {
echo "$a $b";
}
example_func();
// "shiro goma"
練習としてfunctions.phpにこのプログラムを用意しました。
WordPressにshiro gomaと出力されます。
アクションフック(add_action)とは
アクションフックとは指定した箇所に後から関数を追加する予約ができるシステムです。add_actionはdo_actionという関数とセットで使われていて、例えば
add_action("init", "example");
というアクションフックを追加するとしたら、どこかのファイルに、
do_action("init");
と記載されている部分があり、そこのコードが実行されるタイミングで追加した関数も実行してくれるようになります。
先ほどの例を少し改造してみます。
function example_func ($a = "shiro", $b = "goma") {
do_action("example_action");
echo "$a $b";
}
example_func();
"example_action"というアクションフックを用意しました。
ここにアクションを追加してみます。
add_action("example_action", "add_example_action");
function add_example_action () {
echo "blog:";
}
function example_func ($a = "shiro", $b = "goma") {
do_action("example_action");
echo "$a $b";
}
example_func();
// "blog:shiro goma"
$aと$bが出力される前にdo_actionが読み込まれ、このフックにadd_example_actionという関数が予定されているので出力される文字列は"blog:shiro goma"となります。
フィルターフック(add_filter)とは
こちらもadd_filterとapply_filterと対応している点は同様です。アクションフックは関数の追加を予約していたのに比べて、フィルターフックは既存の変数や配列の変更も想定しています。先ほどの例を用いてサンプルを見ていきます。
function example_func ($a = "shiro", $b = "goma") {
do_action("example_action");
echo apply_filters("example_filter",$a) . " $b";
}
example_func();
"$a $b"だったところの$aにフィルターフックを追加しました。なので"example_filter"フィルターフックに追加すると$aの値を用いて変更や削除、追加ができるようになるわけです。以下のフィルターを追加した場合
add_filter("example_filter", "add_example_filter");
function add_example_filter ($a) {
$new_a = "taji is $a";
return $new_a;
}
function example_func ($a = "shiro", $b = "goma") {
do_action("example_action");
echo apply_filters("example_filter",$a) . " $b";
}
example_func();
// "taji is shiro goma"
このように$aの値の前に"taji is "という文字列を追加することができました。
まとめ
今回はアクションフックとフィルターフックを解説しました。WordPressはフィルターフックについてしっかり理解するとカスタマイズ力がとても上がります。
ちなみにアクションフックは内部的にはフィルターフックのエイリアスになっていますが、使いやすいのでわかりやすいところから感覚的に理解して使い分けると良いと思います。