フックとは?
WordPressがコードを実行する時にあるチェックポイントのようなものです。
フックを見つけるとコードの実行を止めて、そのフックに登録されている関数を確認します。
もし登録されている関数があれば実行した後、処理を続けていきます。
フックには、アクションとフィルターの2種類があります。
フックの種類
アクション
アクションは、特定のチェックポイントで何らかのタスクや出力を行います。
フィルター
フィルターは、変数または出力を変更します。全てのフィルターはパラメータとして、あなたが変更できる変数を提供します。
ワードプレスの関数の多くは、投稿を出力するために利用されます。例えば、the_title()は投稿のタイトルを出力します。
アクションをフックする
アクションをフックするために、add_action()を使います。
add_action( string $hook_name, callable $callback, int $priority = 10, int $accepted_args = 1 )
add_action()は、フック名とコールバックの最低限2つの引数が必要です。3つ目の引数には、優先度を指定できます。
今はadd_action()を例を示します。
add_action('init', 'my_function_name');
function my_function_name() {
// 実行したい内容
}
add_actionの最初のパラメータは、アクションの名前です。今回の例では、initです。これはWordPressのフックで重要なものであり、初期化する際に実行されます。
2番目のパラメータはコールバックです。実行したい関数の名前を指定します。
無名関数も利用できます。関数名を指定せずにadd_actionの中で関数を実行します。
add_action('init', function() {
// 実行したい内容
});
無名関数は同じ関数名をつけているか心配する必要がなくなるので、好んで使われます。
あなたが定義したPHPクラスの中でアクションを実行したい場合、コールバックのパラメータとして配列を指定します。配列の1番目の要素にはクラスオブジェクトを、2番目の要素には関数名を指定します。
class MyClass {
public function __construct() {
add_action('init', array($this, 'myFunctionName'));
}
public function myFunctionName() {
// 実行したい内容
}
}
フィルターをフックする
フィルターをフックするためには、add_filter()を利用します。
アクションと同様に最初のパラメーターはフィルター名です。そして、2番目はコールバックになります。
さらに3番目に優先度の指定ができ、4番目では引数の数を指定できます。
次にadd_filterの例を示します。
add_filter('the_title', 'my_function_name');
function my_function_name($title) {
// 実行したい内容
return $title;
}
この例では、the_titleフィルターにフックして、my_function_name関数を実行するように命令します。
フィルターは変数を変えるために、必ず引数を一つ持ちます。
上記の例では、$titleであり、この変数を操作することで投稿のタイトルを変更することが可能です。
またフィルターでは、必ず何らかの値を返す必要があることを覚えておきましょう。
優先度
add_action及びadd_filterの3番目の引数では、コールバックの優先度を数値で指定できます。
これは同じフックに複数のコールバックがある場合に活用します。
コールバックを行う順番によっては、結果が異なる場合があるからです。
もし優先度を指定しない場合は、10に設定されます。
優先度の数値が低いほど、早く実行されます。ただしマイナスの数値は指定することができません。
もし同じ優先度のコールバックが複数あった場合、WordPressはそれを見つけた順番に実行していきます。
functions.phpでinitアクションフックに次の4つのコールバックを登録します。
add_action('init', 'my_function_name');
add_action('init', 'my_function_name_2');
add_action('init', 'my_function_name_3', 1);
add_action('init', 'my_function_name_4', 100);
実行される順番は次のようになります。
- my_function_name_3(優先度1)
- my_function_name(優先度10)
- my_function_name_2(優先度10:後から読み込まれたコード)
- my_function_name_4(優先度100)
引数の数
通常、フックはコールバックに利用するためのいくつかの追加データを提供します。
例えば、save_postは2つの利用可能な引数を提供します。それは投稿IDと投稿オブジェクトです。
もし引数の数が指定していなければ、その数は1になります。
アクションで引数を指定する必要がない場合でも、初期値を利用することが可能です。
add_action('save_post', 'my_function_name', 10, 2);
function my_function_name($post_id, $post) {
// 実行する内容
}
上記の例では、WordPressは2つの引数をコールバックへ渡します。
先ほど述べたように3番目の引数は優先度です。もし上記の例で引数の数を1に指定すると、コールバックの2番目の引数である$postは未定義となります。
フックを自作する
もしあなたがテーマもしくはプラグイン開発者である場合、フックの導入はコードを変更することなく変えることができるので推奨されることです。
アクションと登録する場合はdo_action
()、フィルターを登録する場合はapply_filters
()を使います。
do_actionは最低一つのパラメータが必要です。それはアクション名です。
アクションを登録する際の注意点として、アクション名はユニークである必要があります。
アクションはあなたが置きたい場所のどこにでも置くことができます。
例えばテーマの場合、bodyタグの直後にアクションを置くことでスクリプトを出力するために利用ができます。
...
<body>
<?php do_action('my_after_body'); ?>
またフック名の後にパラメータを置くことができます。
apply_filters()
は最低2つのパラメータが必要となります。フィルター名と変更に利用する変数です。
参考: