WordPressにはactionやfilterという仕組みがあり、ユーザーにレスポンスを返すまでの流れの中の任意のポイントで事前に登録したコールバック関数を実行することができます。これにより、WordPressの内部処理における制御の流れをコントロールすることができ、テーマやプラグインの中で頻繁に利用されています。
従来のAPIからの変更点
actionやfilterを使う場合は、通常add_action
やadd_filter
というAPIを使ってコールバック関数を登録しますが、内部構造を理解している人は、以下のようなハックをしているかもしれません。というのは、以前のadd_filter関数の中身が以下のように実装されていたからです。
1 2 3 4 5 |
// From a part of wordpress sources. // wp-includes/plugin.php ... $wp_filter[$tag][$priority][$idx] = array('function' => $function_to_add, 'accepted_args' => $accepted_args); ... |
$wp_filter
は、単純なarrayとして実装されていたので上記のような配列アクセスで値を代入できました。しかし、今回はWP_Hookというクラスに置き換わっています(このクラスは、IteratorとArrayAccessを実装しているので配列のような振る舞いをします。https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-hook.php)。そして、タグごとにWP_Hookオブジェクトが生成されています。
WP_Hookのメソッドを使う
以上をふまえ、actionやfilterの登録にはadd_action
やadd_filter
のAPIを使うかまたは以下のような方法でも可能なようです。
add_action、add_filter
1 2 3 4 5 6 7 8 9 |
// ----- 新しいWP_Hookクラスのメソッドを使う ----- global $wp_filter; // tag, function, priority, accept_args $hook = isset($wp_filter['wp_head']) ? $wp_filter['wp_head']: new WP_Hook(); $hook->add_filter('wp_head', 'my_func', 10, 1); // ----- これは以下と同じ ----- add_action('wp_head', 'my_func', 10, 1); |
1 2 3 4 5 6 7 8 9 |
// ----- 新しいWP_Hookクラスのメソッドを使う ----- global $wp_filter; // tag, function, priority, accept_args $hook = isset($wp_filter['the_content']) ? $wp_filter['the_content']: new WP_Hook(); $hook->add_filter('the_content', 'my_func', 10, 1); // ----- これは以下と同じ ----- add_filter('the_content', 'my_func', 10, 1); |
冗長になるので素直にadd_actionやadd_filter関数を使った方がいいですね。。
コメント