WordPressの開発で必要になる『フック』って何?
私は元々C言語からプログラミングの世界に入ったのですが、C言語に慣れていると、PHPを触った時に不可思議な動きをするプログラミング言語に見えてくるんですね。
コンパイル型とインタープリタ型の違いというのもあるのでしょうけど、プログラムがどこから動き始めるのか良くわからないって感じたのを今でも覚えています。
さて、Wordpressの開発においても、同様に感じるかもしれない仕組みが存在します。(PHP使いには一般的なんだろうか・・・
それが『フック』という仕組みです。
『フック』とは
特定のタイミングでコールバック関数を設定できる仕組みです。
このフックにはフィルターフックとアクションフックという物があり、設定の仕方はほぼ同じですが、変更を加える対象が違うようです。
そしてフックのタイミングはかなりたくさんあり、フィルターフック一覧とアクションフック一覧で確認できます。
私が思うに、フックって処理のストリームに乗っけるように自分の書いたメソッドの処理を割り込ませるため、大型船にくっつくために小型船がフックをかけるようなそんなイメージで『フック』って名前になったんじゃないかなーって思います。
フックに設定した関数は特定のタイミングでWordpressから呼び出されます。
よくWordpressのheader.phpとfooter.phpを開くと、wp_head()とwp_footer()があると思います。
これもフックに設定されたstylesheelやscriptのリンクを呼び出しているんだと思われます。
アクションフック
アクションフックの場合、フックを登録する関数がadd_actionになります。
PHP
add_action('フック名', 'コールバック関数名', '優先順位', '引数の数');
PHP:クラス内で使う場合
add_filter('フック名', array($this, 'コールバック関数名'), '優先順位', '引数の数');
引数 | 詳細 |
---|---|
フック名 文字列型 | 以下を参照してください アクションフック一覧 |
コールバック関数名 文字列型 | 実際に呼び出される関数名を入れます。 ここで設定した関数が、フックのタイミングで実行されます。 |
優先順位 整数型省略可 | 小さい数字から優先的に実行されます。 |
引数の数 整数型省略可 | コールバック関数に渡す引数の数 使ったことないのでわからないけど、引数が2つ以上あるときはここにちゃんと書こうねってことなのかな |
例えば、ショートコードを登録する場合、フックを利用しますが、functions.phpに以下のような感じで記述します。
<?php
// labelタグを表示するショートコード
function set_shortcode($str) {
return "<label>{$str}</label>";
}
add_shortcode('label','set_shortcode');
このアクションフックで追加したショートコードを呼び出す時は以下の通りです。
[label "POINT01"]
フィルターフック
フィルターフックを使う場合、呼び出す関数がadd_filterに変わるだけで、使い方はアクションフックと同じです。
PHP
add_filter('フック', 'コールバック関数名', '優先順位', '引数の数');
PHP:クラス内で使う場合
add_filter('フック', array($this, 'コールバック関数名'), '優先順位', '引数の数');
引数 | データ型 |
---|---|
フック名 文字列型 | 以下を参照してください フィルターフック一覧 |
コールバック関数名 文字列型 | 実際に呼び出される関数名を入れます。 ここで設定した関数が、フックのタイミングで実行されます。 ここはアクションフックと同じですね。 |
優先順位 整数型省略可 | 小さい数字から優先的に実行されます。 これもアクションフックと同じです。 |
引数の数 整数型省略可 | コールバック関数に渡す引数の数 これもアクションフックと同じです。 |
フックで気を付けること
フックの中には影響範囲が大きい物・小さい物がある
フックの影響範囲って何かっていうと、呼び出される回数が多かったりして、いろんな所でフックが呼び出される場合です。
例えば、the_titleは投稿のタイトル取得時のフックですが、ページトップのタイトルだけではなく、投稿一覧とかお知らせ一覧のデータ取得にもthe_titleが適応されます。
なので、「ページトップのタイトルにちょっと細工したろ!」と思って、何も考えずにthe_titleしちゃうとトップページのお知らせ一覧にも全部細工がかかっちゃうなんてことになったりしますので、ご注意あれ
そこは解決策として、メソッド内で条件分岐を設定して、現在のページがトップページではないことなどを確認して作った方が良いでしょうね。
もしお困りごとがありましたら、お問い合わせフォームよりご相談ください。