WordPressのコードについて調べていると度々登場する add_action()
や add_filter()
というコード。これらはそれぞれのフックを起動させるためのコードです。
自分もよく使ってはいたものの、ふと「フックとは何だろう?」と思ったので、どういうものなのかを調べてみました。アクションフックとフィルターフックについての覚書メモです。
初期設定の処理を変更するために使うのがフック
WordPressにはさまざまな機能が用意されていますが、このページが表示されたら、この投稿が更新されたらある処理を追加したいなど、カスタマイズしたいことが出てくる場合があると思います。
この時にWordPress本体のコードを変更してしまうと、WordPressがアップデートされた時に変更した内容は消えてしまいます。そもそも本体のコードを改変するのはエラーを引き起こしやすく保守の点からも避けたいところです。
そこでWordPress本体のコードはそのままにして、処理する内容を一部変更または追加するために用意されているのが「フック」です。
ページが表示されるまでには様々な処理がされています。その処理がされるタイミングで新たな処理を追加させるためにフックがあります。「この処理がされるタイミングで」というのをフックで指定しているイメージです。
アクションフックとフィルターフック
WordPressにはさまざまなフックがあり、その中でもアクションフックとフィルターフックという種類に分けられています。
アクションフック | フィルターフック | |
---|---|---|
フックで実行すること | 新たに追加した処理を実行 | 特定の変数を変更するための処理を実行 |
登録するメソッド | add_action | add_filter |
特定の箇所で実行させる メソッド | do_action do_action_ref_array | apply_filters apply_filters_ref_array |
返り値 | なし | あり |
特定のタイミング何かしらのアクション(処理)を追加するのがアクションフックです。機能の一部を変更したり、そこに新たな機能を追加したい時に使います。add_action()
という関数を使ってアクションフックを登録します。
データベースに保存するときや値を取得するときなどにデータの内容を変更するのがフィルターフックです。add_filter()
という関数を使ってフィルターフックを登録します。
2つの主たる違いは値の受け渡しがあるかどうかです。
アクションフックは「このタイミングで他にしたいことを伝える」機能の変更・追加のため、値の受け渡しの必要はありません。
フィルターフックは「この内容について変更したいことを伝える」ため、一度値を取得して変更した値を返す動きになります。
フックの使い方
フックの使い方は以下のような流れになります。
- どんな処理をするか、という関数を作成する。
- 特定のフックに関数を登録する。
登録したアクションフックの内容は、特定の箇所で動作させることもできます。
add_actionやadd_filterで追加・変更処理を登録する
フックは add_action()
や add_filter()
と一緒に使います。前述したようにアクションフックには add_action()
、フィルターフックには add_filter()
を使用します。
function 関数名(){
//処理内容
}
add_action('action_hook', 'function', 優先度, 関数に渡す変数の値)
function 関数名(){
//処理内容
}
add_filter('filter_hook', 'function', 優先度, 関数に渡す変数の値)
「action_hook, filter_hook」にはフック名が入ります。用意されているフックから選んで使用します。
「function」には定義した関数名を記述します。
Hooks | WordPress Developer Resources
「優先度」と「関数に渡す変数の値」は任意で、省略可能です。
優先度の部分で小さい数で設定されているものほど先に呼ばれます。省略されている場合はそのフックに元々設定されている数値が当てはまります。
処理内容によっては順番が適切でないとうまく処理がされない場合があります。
あまり早い順番にしてしまうと本体の処理の前に動作してうまくいかなくなりやすいので、遅めの方が無難ではあります。
コードに不具合がなくうまくいかない場合は、この優先度を変更することでうまく処理されることもあるので変更して動作するか確認してみてください。
do_actionで特定の場所にフックを設定
フックは特定の場所に設置することができます。この場合、 do_action()
や apply_filters()
という関数を使って設定します。
テーマを自作する時に必ずといっていいほど記述する <?php wp_head(); ?>
ですが、これは do_action
を使用して wp_headフックを実行させている関数です。
function wp_head(){
〜省略〜
do_action('wp_head');
}
このように実行させるたい独自の関数を作って任意の箇所で動作させるようにすることもできます。
<?php do_action('action_hook', $args); ?>
<?php apply_filters('action_hook', $args); ?>
各フック名と、 $args
には引数のリストが入りますが必要な場合のみ記述する形で省略可能です。
WordPressではフックと関数に同じ名前が使われている場合もけっこうあるので、混乱することもあると思います。関数とは何か、フックとは何かがちゃんと分かっているとコードの理解がしやすいです。
フックを削除
remove_action
でフックを削除することができます。
remove_action( 'wp_head', 'example01' );
不要なアクションがある場合はこちらの設定をしてみてください。管理画面のカスタマイズをする時に使用することが多いです。