2012年01月10日に投稿

[WordPress]プラグインとして追加できるフィルター機能はどのように実現されているのか

add_filter関数はオリジナルのフィルター関数を登録するための関数で、フィルター関数を登録するとWordPressが出力するあらゆるデータを加工して出力を行うことができます。apply_filters関数は登録されたフィルター関数を実行するための関数です。どのような仕組みで実現されているのか気になったのでソースコードを確認しました。完全にトレースできたわけではありませんが、メモを兼ねて記事として公開します。バージョン3.1.3のソースコードとなります。

例えば下記のようなコードをプラグインファイルに記述してpluginディレクトリにアップロードすると、全ての記事タイトルに(こんにちは)という文字列が連結されて表示されます。これはadd_filter関数によって登録されたフィルター関数がapply_filters関数によって、画面に出力される前に(こんにちは)という文字列を連結させる処理を実行しているためです。

add_filter関数は wp-include/plugin.php で下記のように定義されています。

続いてapply_filters関数です。apply_filters関数は wp-include/plugin.php で下記のように定義されています。

36行目の補足
add_filter関数によって書き込んだのは $wp_filter[$tag][$priority][$idx] という配列であり、[‘function’]というラベルと[‘accepted_args’]というラベルを持っています。current($wp_filter[$tag]) とforeach構文により現在の$priority配列を$the_として処理を行います。

39行目の補足
apply_filters関数に渡された引数を、accepted_argsで指定した数だけフィルター関数に渡して実行します。apply_filters関数の第1引数はフィルタータグなので、第2引数以降がフィルター関数に渡される引数になります。そのためarray_slice関数で0番目の要素は対象になっていません。

$wp_current_filterと$merged_filtersについては調査中としました。これらの処理の中だけではあまり意味を持っていないようなので、他の処理との兼ね合いを見る必要がありそうです。僕のレベルでWordPressのソースを読むと非常に骨が折れますが勉強になる箇所が多いです…引き続きWordPressのソースコード解析を続けたいと思います。

関連記事

Leave a Reply