WordPressの「フック」という仕組みとその使い方ー②実践編ー
昨日の記事ではWordPressの「フック」の概要を魚屋でのやりとりに例えて説明しました。
WordPressの「フック」という仕組みとその使い方ー①概要編ー
今日は実際の使い方を②実践編という形でお届けします。
目次
フックの使い方
フックには二種類ありますが、基本的な考え方はどちらも同じで、違いは戻り値の有無になります。
フィルターフック : 戻り値あり
アクションフック : 戻り値なし
ここではフィルターフックを例に説明をしていきます。
実際のフックの使い方ですが、まずは出力結果を決めている記述がソースファイル内のどこにあるかを見つけることから始めます。
フックは「ひっかける」ものなので、ひっかける元(フィルター)がなければなりません。ソースファイル内からフィルターを見つけます。
例えばwordpress 4.9.8 のダッシュボード画面最下部の「WordPress のご利用ありがとうございます。」(下図)という文言を変更するという場面を想定して、フックの使い方を説明していきます。
フィルターの見つけ方
慣れないうちはフィルターを見つけるだけで時間をとられてしまうことも考えられますが、wordpress本体に設置されているフィルターの情報はWordPressCodexにまとめられているので、そちらを参考にすればフィルターを見つけるという作業は省くことができる場合があります。
ただし、プラグインに設置されたフィルターについてのまとまった情報は一般的には存在しないので、必要なフィルターがどこにあるかを自ら調べられるようにしておくことが望ましいですね。
それでは実際にフィルターを見つけていきます。
wordpressのルートディレクトリ以下全体を対象として、
「WordPress のご利用ありがとうございます。」
という文字列を検索してみますが、見つかりません。
検索条件を緩くし、
「のご利用ありがとうございます。」
で検索すると1件だけ、「wp-content/language/admin-ja.po」ファイルの中に見つかりました。
ファイルの中身を見てみると、以下のように書かれています。
#: wp-admin/admin-footer.php:34
msgid "Thank you for creating with <a href=\"%s\">WordPress</a>."
msgstr "<a href=\"%s\">WordPress</a> のご利用ありがとうございます。"
親切にもwp-admin/admin-footer.php:34と書かれていますね。(これが書かれていない場合はmsgidに含まれている文言 Thank you for creating with を検索するのが妥当です。)
wp-admin/admin-footer.phpの34行目を見てみると
$text = sprintf( __( 'Thank you for creating with <a href="%s">WordPress</a>.' ), __( 'https://wordpress.org/' ) );
と書かれています。
この記述内容自体はフックとは関係ないので深く考える必要はないのですが、$textという変数に結果が代入されているということは重要です。
$textを付近から探すと、wp-admin/admin-footer.phpの42行目に以下の記述が見つかります。
echo apply_filters( 'admin_footer_text', '<span id="footer-thankyou">' . $text . '</span>' );
これがフィルターです。apply_filters関数の引数として、出力対象のデータ(この場合は$text)が使用されているということが、フィルターであるかどうかの判断基準となります。
(補足)フィルターが無い場合
wordpressが日々アップデートされてきた結果、あまり無いことではあると思いますが、仮に上のフィルター部分が echo $text; などとapply_filtersが使用されずにechoされていた場合、それはフィルターの役目を果たさずフックをかけることができません。
その場合は「のご利用ありがとうございます。」が含まれているもっと大きな単位(例えば下図の赤枠部)に対するフックを探して、それをまるごと書き換えてみるなど別の方法をとりましょう。
フィルターの構造
先に見つけたフィルター
echo apply_filters( 'admin_footer_text', '<span id="footer-thankyou">' . $text . '</span>' );
の構造を見ていきましょう。apply_filtersの各引数の意味が重要になります。
第一引数 : フックの名称を意味する文字列です。apply_filters関数の記述者が、このフィルタにフックをかけてもらうために提供するIDとして機能します。
第二引数 : フック関数(後述します)に使用することができるデータです。フックされていないときはapply_filters関数の戻り値として使用されます。
本例では第二引数までしか指定されていませんが、第三、第四 … と引数を指定されている場合もあります。
第二引数以降はフックするときに使えた方が良いと思われるオプションであり、フックをかけていないときは出力結果に影響しません。
現状ではフックをかけていないので、フィルターの戻り値はフィルターの第二引数となります。つまり、
echo apply_filters( 'admin_footer_text', '<span id="footer-thankyou">' . $text . '</span>' );
と
echo '<span id="footer-thankyou">' . $text . '</span>’;
の出力結果は同じになります。
実際にこのフィルターにフックをかけてみましょう。
フィルターにフックする
フックは一般的にfunctions.phpに記述します。
どんなフックでもfunctions.phpに記述しなければならないわけではありませんが、wordpress管理画面が表示されているときにも読み込まれる自身の管理下(テーマフォルダ内)にあるファイルはfunctions.phpなので、本例の場合はfunctions.phpに記述しなければなりません。
functions.phpに以下を記述することでフックします。
add_filter('admin_footer_text', 'new_admin_footer_text', 10, 1);
function new_admin_footer_text($a){
return $a . 'カツオ';
}
この記述で以下のように文言が変更されます。
(補足)目的のフィルターがどれかを判別することが難しい場合
ここまででフックをかける際に必ず行うことになる「フィルターを見つける」という作業が終わりました。
本例では比較的簡単に目的のフィルターを見つけることができましたが、検索条件に該当する記述が膨大にあるなど、場合によっては簡単には見つからない場合があります。
そのような場合は、目的とするフィルターであろうと思われるフィルターに順にフックをかけていき、フック関数(後述します)の内部でdie;(それ以降実行されるはずだった処理を行わずに、動作停止させる)を記述します。
つまり、目的の箇所以下がまるごと表示されなくなった場合に、その時にかけたフック先が目的のフィルターであると判断することができます。
この方法は下手な鉄砲を撃つような方法ですが、手っ取り早くそのフィルタが対象であるか否かを調べるには適していますね。
他にも多くの方法がありますが状況に応じて異なるので、自分なりの方法を見つけていくことが大切だと思います。
次回、フックをかけるための関数の構造を理解し、実際にフックをかけてみましょう。
WordPressの「フック」という仕組みとその使い方ー③詳解編ー