WordPressのフィルターとアクションを復習する
弊社内で「WordPressでお知らせ投稿→そのままユーザーテーブルに載ってる顧客にHTMLメール配信」があれば最高だなという話になってしまい、プラグインを書いて実装しようとしています。
というわけで、WPをHackするには絶対欠かせない機能であるフィルターとアクションについて、自分の復習がてら記事を書きます。
フィルターとは
フィルターというのは日本語に訳すと「ろ過」でございます。何かを通過する際に間に挟むことで、何かを摘出する。そういう役割をする。WordPressにおけるフィルターとは、ある機能(関数)に対して自分が行ないたい処理を挟み込んで上書きする、という役割を果たします。
フィルターを使うためには、フィルター自身を登録するapply_filtersと登録されたフィルターに自分の関数を差し込むadd_filterがあります。適用したフィルターに対してフィルターを追加するというイメージ。
<?php //これによりmy_filter_hookという文字列を引数にとる関数オブジェクトが出来る apply_filters('my_filter_hook','filter example'); //こんなかんじでフィルターを通すと add_filter('my_filter_hook','do_your_filter_method'); //my_filter_hookで呼ばれている処理を完全に上書きできる function do_your_filter_method($message ){ echo $message; }
個人的は完全に上書きだけでなくデフォルトの処理を通せるともっと便利だけど、そうもいかないのよね。
アクション
イベントハンドラのようなもの。ある特定のタイミングで実行したい処理を実行する。とはいっても、やっていることはフィルターと全く同じで、WordPressの機構としてイベントに対するフィルターはアクションと呼ぶぐらいの考え方でいいと思っています。また、フィルターと違ってアクションは複数登録できるようになっているみたい。
WordPressのwp_head()ってこういうコードになっています。
<?php function wp_head() { do_action('wp_head');}
wp_headっていうアクション(フィルター)を登録しています。で、wp-includes/default-filters.phpではこんなActionが仕込まれています。
<?php add_action( 'wp_head', 'wp_enqueue_scripts', 1 ); add_action( 'wp_head', 'feed_links', 2 ); add_action( 'wp_head', 'feed_links_extra', 3 ); add_action( 'wp_head', 'rsd_link' ); add_action( 'wp_head', 'wlwmanifest_link' ); add_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 ); add_action( 'wp_head', 'locale_stylesheet' );
上から順番にActionを登録してます。で、これらの登録されたアクションはWordPressのグローバルオブジェクトに登録され、該当するメソッド名があったらcall_user_func_arrayするという流れです。