WordPressにおけるフック処理の仕組みとは?

WordPressのフックとは何か?

WordPressにおけるフックとは、何でしょうか?
フックというのは、WordPressがページを表示する過程の特定のタイミングで、事前に登録された処理(関数)を実行することができる機能です。ほかのフレームワークでいうところのイベントハンドラ、イベントリスナに相当するものです。

フック機能を使うことでWordPressがページを表示する過程の特定のタイミングで、処理を追加したり変更したりすることができます。


WordPressではプラグインの仕組みがありますが、プラグインの作成者はこのフック処理を利用することで、標準のWordPressの処理を書き換えることでプラグインの機能を実装しています。つまりフック処理を自分で作ることで、WordPressが行っている処理の途中で、自分が作ったプログラムを実行することができます。

ただし、フック処理を実行できるタイミングは任意ではなく、WordPressがあらかじめ用意してくれたいるタイミングの中から、フックプログラムを作る人が選択する形となります。


WordPressに用意されているフックの種類は2つ

WordPressはフックを2種類用意しています。
その2つとはアクションフックと、フィルターフックです。

1.アクションフック

アクションフックというのは、WordPressページを表示する過程の、特定のタイミングで追加の処理を追加することができます。アクションフックは処理を差し込むだけですので、アクションフックの戻り値はありません。

アクションフックはWordPressが用意していいる、add_action()関数を使って登録します。
WordPress自体がPHPで作成されているため、フック処理ももちろんPHPのプログラムとして作成します。
関数は以下の形式で記述します。

add_action( 'フックさせたい場所の名前', 
            '呼び出してほしい関数名', 
            優先順位[省略可能],
            引数の数[省略可能] );


アクションフックは、function.phpに記述します。
フックは”どのタイミングで”、”何を実行してほしいか”を指定する必要があるため、最初の二つは必須です。

3つ目と4つの引数である、優先順位、引数の数は省略可能です。
優先順位というのは、同じフックポイントで複数のアクション/フィルターが登録された場合、WordPressがどの順序で呼び出すかよいかを判定するための順序です。数字が小さいほうが優先度が高く、同じ番号を複数指定された場合はadd_action/add_filterで先に登録されたフックのほうが優先して実行されます。優先順位は省略すると10になります。

引数の数、登録したいフック関数の引数の数で、省略すると1が指定されたとみなされます。


2.フィルターフック

もう一つのフックであるフィルターフックは、WordPressが元々行っている処理の結果を差し替える場合に使用します。もっと具体的に言うと、WordPressの特定の変数を書き換えるための仕組みです。
書き換えた後の値(=フィルタ後の値)はフィルターフック関数の戻り値としてWordPress本体に返します。
フィルターフックの登録は、add_filter()関数を使用します。

呼び出し形式は以下のような形です。関数名が違うだけで、引数はadd_action()と同じです。

add_filter( 'フックさせたい場所の名前', 
            '呼び出してほしい関数名', 
            優先順位[省略可能],
            引数の数[省略可能] );





アクションフックと、フィルターフックである、add_action()とadd_filter()の違いをまとめると、WordPress上の処理にいおいて処理が追加されるか?と、既存の処理を差し替えるか?です。


フック処理を利用すると何ができるか?

フック処理を利用することで、WordPressの本来の処理を変更することができます。
例えば、以下のようなことができます。
  • タイトルの入力欄の変更を行う。
  • 管理画面に項目を追加する。
  • 記事の内容(content)を差し替える。


WordPressで用意されているプラグインを入れると上記の様なことが行えると思いますが、これと同じことを自作することができます。(プラグイン自体がフック機能を使って実装しているので当たり前のことですね…)

試しにフック処理を作ってみる

では試しにフックを作ってみましょう。
今回は簡単に、タイトル入力欄の変更を行ってみます。

タイトル入力欄というのは、WordPressで新規投稿を行う際に出てくる、タイトル未入力時に表示される下記の赤枠内のメッセージの事です。



下記のプログラムを,function.phpのファイル名で保存してください。

<?php
function test_change_title( $name ) {
	$curr_screen = get_current_screen();
	if ( $curr_screen->post_type == "post" ) {
		$name = "タイトルを30文字以内で入力してください";
	}
 
	return $curr_screen;
}
 
add_filter( "enter_title_here", "test_change_title" );

 
今回は、test_change_title()というフック関数を作成しました。
関数名はなんでもよいですが、WordPressが最初から用意している関数の名前と重なるとエラーになってしまいます。サイトの名前を関数名の先頭につけるなどして、WordPressの関数名と重複しないようにしてください。

また今回のサンプルではフィルタフックを使っているのですが、フィルタフック(add_filter)の場合は、returnでフィルタ後の値を返す必要があるので、注意して下さい。


フック関数を作ったらadd_filter()でフック関数を登録します。
第一引数は、enter_title_hereとありますが、これはWordPress側で使用できる名前(=フック処理を挿入可能な場所)があらかじめ決められています。
第二引数は、先ほど作った関数の名前を指定します。

上記のプログラムが実行されると、先ほど”ここにタイトルを入力”となっていたのが、以下のようにメッセージが変わります。


本フックはあまり有用ではないですが、コンピュータに詳しくない人が記事投稿を受け持っている場合など、わかりやすいメッセージに変えてあげると親切かもしれません。例えば製品一覧のページを作っているのであれば、”製品名を入力してください”に変えるなどしておくとわかりやすいです。

フック処理の実装

アクションフック、フィルターフックに関する処理はWordPressのコアファイルである wp-includes/plugin.phpで実装されてい明日。
ファイル名はplugin.phpとなっていますが、WordPressのコアファイル内でもこの仕組みは利用されています。またテーマに入っているfunction.phpからもこの機能を利用している場合もあります。

フック処理がどのように実装されているかは、下記の書籍の2章に詳しく書かれています。他にもWordPressの仕組みが詳しく書いてあるので、プラグインを作る必要がある場合は一冊持っておくと良いです。。
詳解 WordPress

アクションフック/フィルタフックの探し方

WordPressには数多くのフックが準備されています。
自分が求めているタイミングでフックがあるかをまず探すことになるのですが、どのようなフックがあるかの一覧は、WordPressドキュメントのCodexで探すことができます。
フック名をクリックすると説明が表示されるのですが、ほとんどのフックは翻訳されていないため、横にあるenというリンクをクリックしてください。英語ですが説明が表示されます。
プラグイン API/アクションフック一覧

プラグイン_API/フィルターフック一覧


また、過去のバージョンごとのフック一覧は、下記のサイトで確認すると簡単です。
こちらのサイトではWordPressのバージョンアップに伴い、追加/削除されたフックの一覧や、該当のアクション・フィルタフックがWordPressコアファイルのどこから呼び出されているかを確認することができます。
WordPress Hooks Database

上記のドキュメント以外にWordPressのソースから調べることもできます。

add_action, add_filterで登録した関数は、WordPressのコアファイルから呼び出されています。
コアファイル側は、do_action(), apply_filters()関数で登録されたフックを実行しているので、この関数名とフック名で検索すると見つかります。
プログラムが読める方は、どのタイミングでフック処理が実行されているかや、各フック処理が何の引数を渡してもらえるかを確認できます。

サイトの拡張性を飛躍的に高める WordPressプラグイン開発のバイブル

関連記事

コメントを残す

メールアドレスが公開されることはありません。