WordPressの「フック」という仕組みとその使い方ー③詳解編ー
さて、WordPressの「フック」について3回にわたって解説してきました。今回が最終回となります。
WordPressの「フック」という仕組みとその使い方ー①概要編ー
WordPressの「フック」という仕組みとその使い方ー②実践編ー
フィルターの構造
前回の記事で見つけたフィルター
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 . 'カツオ';
}
この記述で以下のように文言が変更されます。
フックの内容を詳しく見ていきましょう。
add_filter関数について
フックをかけるための関数です。引数について見ていきましょう。
第一引数 : フックの名称です。フックをかける対象となるapply_filters関数の第一引数と同じ文字列を指定します。
第二引数 : フック関数(後述しますが、apply_filtersの戻り値を決める処理を記述した関数のことです。)の名称を文字列で指定します。フックはフック関数を経由することによって出力結果の操作を行います。
第三引数 : 同じフィルターに複数のフックが定義されていた場合の実行順序を数値で指定します。デフォルト値は10です。数字が小さいほど先に実行され、同じ数字の場合はフックが追加された順番で実行されます。
第四引数 : 対象となるapply_filtersに定義された第一引数より後の引数を、順にいくつ使用するかを数値で指定します。
フック関数について
apply_filtersの戻り値を決める処理を記述した関数のことです。
function new_admin_footer_text($a){
return $a . 'カツオ';
}
について、
この部分がフック関数にあたります。
add_filterの第二引数で指定された文字列が関数名とされていなければなりません。
apply_filters関数
$a : apply_filtersの第二引数を受け取るための引数です。引数の名称は任意で良く、$aである必要はありません。
本例ではapply_filters関数は第二引数までしか指定されていませんので、フック関数に定義する引数は一つのみとなりますが、
apply_filters関数の第二、第三、第四… 引数が定義されている場合は、フック関数の第一、第二、第三... 引数として受け取ることができます。
フィルターに定義されていた引数を使わずにフックすることもできます。
add_filter('admin_footer_text', 'new_admin_footer_text', 10, 0);
function new_admin_footer_text(){
return 'カツオのブログをご利用ありがとうございます。';
}
apply_filtersで指定された引数を使用しない場合、add_filterの第四引数は0とし、フック関数自体の引数指定も外しています。
結果は以下のようになります。
補足:前の例では引数の定義を廃止しましたが、下のように引数の定義自体は廃止せずに同じ結果を得ることもできます。
add_filter('admin_footer_text', 'new_admin_footer_text', 10, 1);
function new_admin_footer_text($a){
return 'カツオのブログをご利用ありがとうございます。';
}
(補足)フック関数を無名関数で定義する
下のように、フック関数を無名関数で定義することも可能です。
add_filter('admin_footer_text', function ($a){
return $a . 'カツオ';
}, 10, 1);
各種プラグインなどに定義されている関数名と同じ名前のフック関数を定義してしまった場合、関数名の重複により正常に動作しなくなってしまいます。
無名関数で定義しておくと、あらかじめそのリスクを避けることができます。
他で使い回すことのない処理であれば無名関数で定義しておいた方が安全ですね。
フックの使い方のまとめ
フックという仕組みはapply_filters関数、add_filter関数、フック関数のそれぞれを紐づけることで実現されています。
紐付けの方法は下図のようになりますので、再確認しておきましょう。
上の例の出力結果は下のようになります。
apply_filtersのデフォルトの戻り値です。フック関数内で使用することもできます。ここでは「フック関数内で使用することが可能なオプション引数1」と「フック関数内で使用することが可能なオプション引数2」も併せて出力しています。
長くなりましたが、フックについての基本事項の説明はここまでとなります。いかがでしたか?
フックを使うとコアファイル内の処理に影響を与えることが出来るようになるので、実現できることが格段に増えます。
「もともとそういう動きをするからどうしようもない」と諦めずに、ソースコード内に定義されているであろうフィルターを探すことから始めてみましょう。きっと次の道が見えてくるはずです。