2018年08月01日
Docker for Mac を使って WordPress の...
2018年07月29日
Docker for Mac のインストール
2018年07月08日
Docker 便利コマンドあれこれ
2018年07月08日
オライリーの Docker 本(Docker Up &...
2018年07月05日
iPad mini 2 を購入しました
2018年07月04日
Docker で Jenkins するときのあれこれ

HOME > カテゴリ(WordPress)の記事

WordPress プラグインをカスタマイズする場合は、apply_filters() を探せ!



なんとなく、WordPress のフィルター機能について理解できた(つもりになっている)ので確認の意味も含めてエントリしします。

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() を探せ!」に頂いたコメント

  1. […] WordPress プラグインをカスタマイズする場合は、apply_filters() を探せ … […]

  2. aki より:

    この記事のおかげで結婚できました!(殴
    じゃないですけど、衝撃的にわかりやすかったです!
    初めて理解できました。

    感謝です!
    ありがとうございました。

この記事にコメントする





Copyright © 2012 - 2013 MacBook Air とWordPressでこうなった All rights reserved
Designed by Theme Junkie. Powered by WordPress.