WordPress の add_action と add_filter などのフックが分からないから調べた!

調べることにした理由!

前回 WordPress のプラグイン無しですごく簡単に記事を読む時間表示しよー ってポストでご紹介したコードで add_action を使っていたのですが、このポストを見ていただいた方から add_filter の方が良いと Twitter でメッセージいただけました!ただ、この時わたしは WordPress の add_action と add_filter の違いを正しく理解出来ていなかった(フック全般)ので、どうして add_filter の方が良いのか疑問だけ残りました。ってことで良い機会なので調べてスッキリさせよ〜と思います!

フックて何でしょう?

そもそもこの add_action、add_filter とかの WordPress 専用の関数はプラグイン API 用のフック (hook) と呼ばれるもので、アクションフックとフィルターフックがあるみたいです。簡単に言えば、プラグイン作るならフックを使えば自由度の高いことできますよって感じでしょうか?w

add_action と add_filter の違い

プラグイン API – WordPress Codex 日本語版 より引用

アクション: アクションは、実行中の特定のポイントもしくは特定のイベント発生時に WordPress のコアが起動させるフックです。アクション API を使用して、これらのポイントで実行中の PHP 関数を一つ以上指定することができます。

フィルター: フィルターは、データベースに追加する前やブラウザのスクリーンに送り出す前にさまざまなタイプのテキストを改造するために WordPress が起動させるフックです。プラグインは、フィルター API を使用して、これらのタイミングで特定のタイプのテキストを改造するために一つ以上の PHP 関数の実行を指定することがきます。

場合によっては、アクションとフィルターのどちらでも同じ目的を達成することができます。例えば、プラグインに投稿のテキストを変更させるには、publish_post にアクション関数を追加してもいいですし(これにより、この投稿はデータベース保存時に変更されます)、the_content にフィルター関数を追加してもかまいません(これにより、この投稿はブラウザに表示されるときに変更されます)。

codex には上記のように書かれているんですが、色々と試したわたし的な感想はどちらも同じような挙動をするなーと思っています。まだ理解度が足りないだけかもしれません。ただ1点試す中で気付いたことがありました。

実行タイミングが違う

具体的には、add_action で return をするフック、add_action で echo をするフック、add_filter で return をするフック、add_filetr で echo をするフックの4種類(同じ内容のことをしていて)を同時に実行していて、わたし的には結果は同じになると思っていたところ、出力後の内容に差があり驚きました。

調べてみて分かったんですが、実行されるタイミングが違うことにより表示される内容に差が出たんだと思います。こちらの WordPress プラグイン作成前の基礎知識 | WEBプログラム覚書 で「プラグイン動作の仕組み」の項で分かりやすいイメージで説明されています。

WordPress の実行タイミングhttp://www.kantenna.com/storage/pg/img/wp.png

このイメージを見る限り、add_action が実行された後に、add_filter が実行されているみたいです。もっと正確には WordPress 本体プログラムのソース読めば分かるんでしょうけど、それは出来ていませんw

フックの使用例

基本的には add_action と add_filter 同じ書き方で同じ挙動をすると思います。ここでは add_action で書いてみます。finctions.php にコピペして色々と試してみてください。

1
2
3
4
5
6
7
8
9
<?php
// 記事本文の前に記事文字数と読む時間を表示する
function user_add_message($content){
	$moji = mb_strlen(strip_tags($content));
	$count = floor($moji / 500) + 1;
	return '<p class="user-message">この記事は約 '.$moji.' 文字なので、約 '.$count.' 分で読めると思います。</p>'.$content;
}
add_action('the_content',user_add_message');
?>

※ the_content の部分が hook_name なので、WordPress で使える hook_name は次の項を見てみてください。

WordPress で使えるフック

ついでなので WordPress で使えるフック (hook_name) はどれだけあるか調べました。こちらの WordPress のコアファイルを読んだりフックを使って強力にカスタマイズする際に役立ち過ぎてギックリ腰になるサイト2つ | ウェブル ですごいサイトが紹介されていました。

http://adambrown.info/p/wp_hooks
WordPress hooks database – action and filter hooks for wp plugin developers — Adam Brown, BYU Political Science

WordPress の各バージョンが対応しているフック (hook_name) が分かって非常に便利ですね!
プラグインを作る場合は参考にしたいと思いまーす!

まとめ

add_action と add_filter は同じような挙動をするとは言え、実行のタイミングが違ったり、そもそも分かれている目的があるのでその目的に合った使い方をしているのが無難だと思いました。

まだこの部分はわたし的には正直曖昧ですけど、add_filter では記事本文に対して何か変更を加えたい時で、それ以外は add_action で良いかな?と思っています。また理解度が深まったり分かったことがあったら追記したいと思います!

参考にさせていただいたページ