CommentOut

WordPressの開発で必要になる『フック』って何? WordPressの開発で必要になる『フック』って何?

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しちゃうとトップページのお知らせ一覧にも全部細工がかかっちゃうなんてことになったりしますので、ご注意あれ
そこは解決策として、メソッド内で条件分岐を設定して、現在のページがトップページではないことなどを確認して作った方が良いでしょうね。

宣伝
WordPressサイトのテンプレート編集やトラブル対応、バグ修正、簡単なJavascriptの作成(カルーセルやバリデーション等)など、小規模なスポット対応を受け付けております。
もしお困りごとがありましたら、お問い合わせフォームよりご相談ください。

この記事を書いた人

uilou

uilou

プログラマー

基本的に、自分自身の備忘録のつもりでブログを書いています。 自分と同じ所で詰まった人の助けになれば良いかなと思います。 システムのリファクタリングを得意としており、バックエンド、フロントエンド、アプリケーション、SQLなど幅広い知識と経験があります。 広いだけでなく、知識をもっと深堀りしていきたいですね。