フックとは
フックとは、『WordPress』にない処理を追加する機能です。
WordPressは、ブラウザからのリクエスト(サイト訪問者がサイトをクリックして)から、その当該サイトのHTMLを返すまでに、たくさんの処理を実行しています。
そして、サイトが表示されるまでの処理の間に、ところどころ『フック』が設けられています。その数あるフックのいずれかに関数を登録すると、そのフックにフックされた関数を自動的に実行してくれるわけです。
アクションフックとフィルターフック
フックには、『アクションフック』と『フィルターフック』があります。
アクションフックとフィルターフックは、利用する場面によって使い分けます。
具体的に、アクションフックは『処理を追加する時』、フィルターフックは『データを加工する時』に利用されます。
WordPressには、最初からアクションフックとフィルターフックがあるため、その既存のフックに対して、処理を追加したりデータを加工したりする機能を与えます。
アクションフックとフィルターフックについては、Codexで確認できます。
フックに処理を追加する方法
アクションフックに処理を追加する場合はadd_action()を使用します。
function 関数名(){
//実行する処理の記述
}
add_action('アクションフック', '関数名');
フィルターフックに処理を追加する場合はadd_filter()を使用します。
function 関数名(){
//実行する処理の記述
}
add_filter('フィルターフック', '関数名');
ちなみに、第二引数に関数名ではなく、以下のように直接関数を記述することも可能です。これを、無名関数と言いますが、無名関数を使用すると、remove_action()による処理の解除ができなくなります。
add_action('アクションフック', function(){
//実行する処理の記述
});
フックに追加した関数の処理を実行
フックに付いている関数を実行するために、do_action()やapply_filters()を使用します。使い方は下記の通りです。
do_action('アクションフック名');
apply_filters('フィルターフック名');
冒頭に既存のフックに関数を追加すると自動的に実行されると書きましたが、実は既存のフックには関数を実行するためにdo_action()やapply_filters()を使用されています。
これだけではわかりずらいかと思いますので、具体的な例を使って説明します。
オリジナルテーマを作成する際に<?php wp_head(); ?>をheadタグ内に記述するかと思います。もしくは、既存テーマのheader.phpに<?php wp_head(); ?>が記述してあるのが確認できるかと思います。
この、<?php wp_head(); ?>の中身を確認するとdo_action()が記述されています。
function wp_head(){
〜省略〜
do_action('wp_head');
}
つまり、みなさんが一度は目にしたことがある<?php wp_head(); ?>は、アクションフックであるwp_headを実行するための関数なんです。
フックを使ってみよう!
アクションフックの例
headタグ内でアクセス解析タグを追加するという例をもとに説明します。
add_action()でアクションフックであるwp_headにアクセス解析タグを埋め込むための関数を追加します。
function access_tag(){
echo ‘<アクセス解析タグ>‘;
}
add_action(‘wp_head’, ‘access_tag’);
こうすることで、headタグに記述されているwp_head()関数(内にあるdo_action(‘wp_head’))によってアクションフックであるwp_head内の関数が実行され、アクセス解析タグが出力されます。
『wp_head』という文字がたくさん出てきて、違いがわかりずらいですよね、、、
私は、当初『wp_head();』と『wp_head』は同じものだと思っていたのですが、wp_headはアクションフック、wp_head()はアクションフックであるwp_headを実行するための関数ということに気づいてようやく違いが理解できました。
アクセス解析タグの埋め込みの流れをまとめると、
- add_actionでアクセス解析タグの埋め込みための関数をアクションフックであるwp_headに追加する。
- headタグ内に<?php wp_haed(); ?>を記述する。(既存テーマの場合は元々記述されている)
- <?php wp_haed(); ?>のタイミングでアクションフックであるwp_head内の関数が実行される。
(wp_head()関数内にあるdo_action(‘wp_head’)により実行されている) - アクセス解析タグがheadタグ内に出力される
と、このような流れになっております。
フィルターフックの場合
the_archive_title()によって出力される文字列を変更するという例をもとに説明します。
the_archive_title()を使用すると、『カテゴリー:〇〇』などのようにカテゴリー名やタグ名の前に余計な文字列が出力されるので、これをフィルターフックを使って削除します。
function my_archive_title(){
if ( is_category() ) { // カテゴリーアーカイブの時に削除する
$title = single_cat_title( '', false );
} elseif ( is_tag() ) { // タグアーカイブの時に削除する
$title = single_tag_title( '', false );
}
・・・以下省略
return $title;
}
add_filter('get_the_archive_title', 'my_archive_title');
add_filter()を使用し、get_the_archive_title()で取得できる文字列に対して、条件分岐によってタイトルを加工して(不要な『カテゴリー:』などを削除して)います。
さいごに
フックを使えるようになることで、WordPressをカスタマイズする幅が格段に広がるので、ぜひ使いこなせるようになっていきましょう!