WordPress WP_Hookでのアクションとフィルタ登録

WordPressにはactionやfilterという仕組みがあり、ユーザーにレスポンスを返すまでの流れの中の任意のポイントで事前に登録したコールバック関数を実行することができます。これにより、WordPressの内部処理における制御の流れをコントロールすることができ、テーマやプラグインの中で頻繁に利用されています。

従来のAPIからの変更点

actionやfilterを使う場合は、通常add_actionadd_filterというAPIを使ってコールバック関数を登録しますが、内部構造を理解している人は、以下のようなハックをしているかもしれません。というのは、以前のadd_filter関数の中身が以下のように実装されていたからです。

// 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_actionadd_filterのAPIを使うかまたは以下のような方法でも可能なようです。

add_action、add_filter

// ----- 新しい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);
// ----- 新しい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関数を使った方がいいですね。。

参考リンク

byebyehaikikyou

日記やIT系関連のネタ、WordPressに関することなど様々な事柄を書き付けた雑記です。ITエンジニア経験があるのでプログラミングに関することなどが多いです。

シェアする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする

Translate »