
WordPress で何かの機能を追加したいな、と思った時はたいがい誰かがプラグインを作成してくれています。
私も便利にプラグインを利用させてもらっている訳ですが、たまにプラグインで出力してくれるタグ(表示)を修正したりと、プラグインをカスタマイズしたい場合があります。
その場合、プラグインのソースコードを修正しても良いのですが、プラグインがアップデートされるたびに修正内容が上書きされてしまい、ちょっと不便。
なので、極力プラグインのソースコードを修正する事は避けたい。
じゃあ、どうするか?という話ですが、プラグインのソースコードの中で、「apply_filters()」という関数がないか調べます。
この関数は、フィルターフックに追加された関数を呼び出す関数です。
参考:関数リファレンス/apply filters – WordPress Codex 日本語版
例えば、WordPress と Twitter を連携してくれる定番プラグインの Twitter Tools を例にすると、
Twitter Tools の中(/wp-content/plugins/twitter-tools/twitter-tools.php )で実際につぶやきを出力する処理(aktt_tweet_display 関数:360行目あたり)では、「 $output 」という変数に出力用のタグを格納しています。
こんな感じ。
$output .= ''.$time_display.'';
その後、return $output する訳ですが、return する前に、
$output = apply_filters('aktt_tweet_display', $output, $tweet);
と、apply_filters() があります。
これの意味は、必要に応じて aktt_tweet_display というフィルター(一番目の引数)で、$output の中身を修正してね、ということになります。
aktt_tweet_display というフィルターがなければ、$output は何も修正されずに、そのまま return されます。
ようは、プラグイン作者があらかじめ、プラグインユーザーが容易にカスタマイズできるように適切な場所に apply_filters() によって、プラグインユーザーの拡張性を確保している訳です。
素晴らしい。
すべてのプラグインがこのような apply_filters() によって、フィルターフックを用意している訳ではありませんが、プラグインをカスタマイズするときは、まずは、apply_filters() を探して、apply_filters() が見つかれば、そのフィルターフックを用いて、カスタマイズするべきです。
フィルターフックを使ってみる
カスタマイズしたいプラグインに apply_filters() があった場合には、それを利用してカスタマイズします。
具体的には、apply_filters() されているフィルターを functions.php に記述します。
例えば、先ほどの例(Twitter Tools)で言えば、出力するつぶやきを格納している $output に、
$output = apply_filters('aktt_tweet_display', $output, $tweet);
というフィルターが適用されています。
apply_filters() の1番目の引数(aktt_tweet_display)がフィルター名で、2つ目以降の引数($output と $tweet)がフィルターに渡されます。
ただ、aktt_tweet_display というフィルターはどこにも存在しません。プラグイン作者が勝手につくったフィルターフックです。
なので、まずは functions.php に、
function my_tweet_display($output, $tweet) { }
というフィルター(関数)を定義します。
フィルター(関数)の返り値は、プラグインの apply_filters() を見れば、
$output = apply_filters('aktt_tweet_display', $output, $tweet);
となっていて、$output が返されることを期待してますので、 return $output とします。関数全体はこんな感じ。
function my_tweet_display($output, $tweet) { // $output に対する処理。 return $output; }
あとは、今回定義した my_tweet_display() 関数をフィルターとして登録するために
add_filter('aktt_tweet_display','my_tweet_display');
を追加します。add_filter() の引数は、一番目(aktt_tweet_display)がフィルターフック名(apply_filters() された名前)、二番目の引数がフィルターの実装(関数名)です。
参考:関数リファレンス/add filter – WordPress Codex 日本語版
まとめると、
$output = apply_filters('aktt_tweet_display', $output, $tweet);
というフィルターフックが定義されている場合、
function my_tweet_display($output, $tweet) { // $output に対する処理。 return $output; } add_filter('aktt_tweet_display','my_tweet_display');
を functions.php に記述してあげればおっけー
あとは、元のソースコードを見て、$output には元々何が入っているのか? $tweet には何が格納されているのか?を確認して、自由に $output の内容を修正するコードを書けくだけです。
すべてのプラグインが、適時 apply_filters() を用意してくれているわけではありませんが、プラグインをカスタマイズする場合は、まずは apply_filters() を探して、apply_filters() があった場合には、functions.php にフィルター(関数)を作成してカスタマイズすると良いと思います。
フィルターフックを用いてカスタマイズした場合、元に戻したいときは、functions.php のフィルター(関数)をコメントアウト(又は削除)するだけで済みますし。
それでは、じゃんじゃん apply_filters() 探して、add_filter() しちゃってください。
でわでわ。
[…] WordPress プラグインをカスタマイズする場合は、apply_filters() を探せ … […]
この記事のおかげで結婚できました!(殴
じゃないですけど、衝撃的にわかりやすかったです!
初めて理解できました。
感謝です!
ありがとうございました。