WordPress アクションフックとフィルターフック概論

プラグインAPI

WordPressの機能をカスタマイズしたことがある人なら、カスタムコード内に add_filteradd_action という関数を見かけたことがあるはずです。
これはWordPressの「プラグインAPI」という仕組みを利用したものです。

え?サンプルコードをコピペしてるだけで中身のコードなんて見たことない?
そんなのダメダメ。

この仕組みが分かると、WordPressの熟練度は「中級」にレベルアップしますッ

アクションフックとフィルターフック

アクション・・・実行中の特定のポイントもしくは特定のイベント発生時に WordPress のコアが起動させるフック。WordPressで発生する特定のイベント。例えば投稿の公開、テーマの変更、管理画面の表示など。
フィルター・・・データベースに追加する前やブラウザに出力する前に、さまざまなタイプのテキストを改造するために WordPress が起動させるフック。

WordPress では、なんらかの動作をする時には必ずアクションが起動され、なんらかの出力がされる時には必ずフィルターが起動されます。

とりあえず、アクションフックとフィルターフックにどのようなものがあるか見てみましょう。
見慣れたものが見つかるはずです。

プラグイン API/アクションフック一覧
プラグイン API/フィルターフック一覧

例えば、投稿を公開した時には、publish_post というアクションが起動します。
で、publish_post というアクションには、いくつかの関数がフックされていて(ひっかけてあって)、投稿を公開すると、それらの関数が実行される仕組みになっているのです。

で、さっきの publish_post というアクションには、すでにディフォルトでいくつかの関数がフックされているわけですが、その中の関数を除外したい場合、もしくは新しい関数を追加したい場合に、「アクションフック」することになります。

add action・・・アクションに関数をひっかける
remove action・・・アクションにひっかけてある関数を取り除く

フィルターの場合も同様。

実例

アクションフック

新しい投稿を公開したら友達にメールを送信する関数を追加したい場合。
まずは、友達にメールを送信する関数を定義して、新しい投稿を公開した時に起動されるアクション publish_post にフックします。

> テーマフォルダ/functions.php

function email_friends($post_ID)  {
	$friends = 'bob@example.org,susie@example.org';
	mail($friends, "sally's blog updated", 
		'I just put something on my blog: http://blog.example.com');
	return $post_ID;
}
add_action('publish_post', 'email_friends');

これで、投稿を公開したら、友達にメールを送信する関数も実行されます。

フィルターフック

記事本文を表示する時に起動するフィルターは the_content です。
the_content には、すでにディフォルトで6つの関数がフックしてあります。

> wp-includes/default-filters.php

add_filter( 'the_content', 'wptexturize'        ); // エンティティ変換する関数
add_filter( 'the_content', 'convert_smilies'    ); // 絵文字をコードに変換する関数
add_filter( 'the_content', 'convert_chars'      ); // メタタグを除去したり、br hr を適切な文字に変換する関数
add_filter( 'the_content', 'wpautop'            ); // Pタグを付加する関数
add_filter( 'the_content', 'shortcode_unautop'  ); // ショートコードにはPタグを付加しない関数
add_filter( 'the_content', 'prepend_attachment' ); // 添付ファイルにPタグを付加する関数

the_content() で記事本文を表示する時、Pタグが自動付加されていたのは、the_content というフィルターに、Pタグを付加する wpautop という関数がフックされていたからなんですね。

では、このPタグを自動付加する wpautop という関数を the_content フィルターから除外したい場合は、remove_filter() を使います。

> テーマフォルダ/functions.php

remove_filter ('the_content', 'wpautop');

これで、Pタグが自動付加されなくなります。

ちなみに、wp-includes フォルダ内はWordPressのコアファイルなので、絶対に、絶対に触ってはいけません。
触っていいのは、テーマフォルダとプラグインフォルダの中だけです。
アクションフックやフィルターフックという仕組みが用意されているのは、そういう意味もあるのです。

関数

add action – アクションに関数をフックする

add_action( $tag, $function_to_add, $priority, $accepted_args );

remove action – アクションにフックされた関数を取り除く

remove_action( $tag, $function_to_remove, $priority, $accepted_args );

add filter – フィルターに関数をフックする

add_filter( $tag, $function_to_add, $priority, $accepted_args );

remove filter – フィルターにフックされた関数を取り除く

remove_filter( $tag, $function_to_add, $priority, $accepted_args );

引数はすべて同じ↓

$tag 除去する関数がフックしているアクションフック(必須)
$function_to_add 除去する関数名(必須)
$priority 関数の優先度(オプション)
$accepted_args 関数の引数の数(オプション)