WordPress特集 - アクションフック・フィルターフックの使い方
公開日:2021年11月24日
WordPress では、WordPress が処理を行う途中のタイミングで、何らかの処理を実行する関数を呼び出す仕組みを持っています。この仕組みをアクションフック・フィルターフックと呼びます。他のフレームワークで言うところの、イベントハンドラやイベントリスナに相当します。
【記事執筆時の環境】
WordPress 5.8
アクションフックとフィルターフック
【参考ページ】
Codex 日本語版 - プラグインAPI
Plugin Handbook - Hooks
フックとは、特定のタイミングで何らかの処理を実行するためのイベントトリガーです。フックを使うと、WordPress 本来の処理に変更を加えたり、新たに処理を追加することができます。
WordPress はさまざまなタイミングでフックを用意しています。そしてそれぞれのフックで、あらかじめ関数を登録し処理を実行させています。そのフックに対して、ユーザーは処理する関数を追加できます。また、WordPress が登録している関数の処理をキャンセルすることもできます。
フックには2種類あり、それぞれ「アクションフック」「フィルターフック」と呼んでいます。2つのフックの違いは以下です。
アクションフック
アクションフックでは、何らかの動作をするアクション(関数)がフックされていて、処理を行うため起動します。ユーザーがアクションフックを使うということは、WordPress 標準の処理に追加の処理を差し込む形になります。
なお、ここで言う「アクション」と「フック」の言葉の意味は、さまざま使われていますので注意してください。
「アクション」は、フックする関数の意味でも使われますし、イベントトリガーであるフックの意味として使われることもあります。「フックにアクションを追加する」「アクションに関数を追加する」は同じ意味です。
また「フック」は、アクションフック名として使われますが、関数を追加する意味での「フックする」という動詞でも使われます。
フィルターフック
フィルターフックでは、WordPress は入力に対してどういう内容を出力するかのデータ処理を行っています。ユーザーがフィルターフックを使うということは、WordPress が元々行っているデータ処理の結果を差し替える形になります。具体的には、フックした関数の処理では特定の変数を書き換えることになります。
「アクションフック -> 処理の追加」ということに対して、「フィルターフック -> データの差し替え」になります。
またフィルターフックではアクションフックと違い、フックした関数の戻り値として、書き換えた後の結果を WordPress コアに受け渡す必要があります。
アクションフックの使い方
【参考ページ】
Plugin Handbook - Actions
アクションフック一覧
アクションフックは独自のものを設置することもできますが、一般的には WordPress があらかじめ設置しているアクションフックを利用します。
WordPress が設置しているアクションフックの一覧は、下記ページをご覧ください。
例えば、WordPress が完全に読み込まれた後(wp_loaded)や、管理画面のメニューが読み込まれる前(admin_menu)などがあります。
Codex 日本語版 - プラグインAPI/アクションフック一覧
Codex - Plugin API/Action Reference
WordPress Hooks Database
アクションフックの実行
アクションフックは、関数 do_action() によって実行されます。WordPress が設置しているアクションフックを利用する場合は、この関数を意識する必要はありません。WordPress コアのファイル内のどこかに記述されています。
独自のアクションフックを設置する場合は、下記のようなコードをテンプレート内に記述します。
do_action( 'アクションフック名' ) で、アクションフックの設置と実行が行われます。そしてこのアクションフックに対して、functions.php 内でフックする関数(アクション)を登録すれば処理は実行されます。
1 |
<?php do_action( 'my_action_hook' ); ?> |
フックする関数の登録
functions.php に記述します。
フックする関数の定義をし、関数 add_action() を使ってアクションフック名とフックする関数を指定します。
add_action() の書式は下記になります。
add_action( $hook_name, $callback, $priority = 10, $accepted_args = 1 )
【パラメーター】
$hook_name
フックされるアクションフック名。
$callback
アクションフックが呼び出されたときに実行される関数。
$priority
アクションフックに追加されている関数が実行される優先順序を指定します。小さい数値ほど早く実行され、同じ優先順位の場合はアクションフックに追加された順序で実行されます。
初期値:10
$accepted_args
フックした関数が受け入れられる引数の数。
初期値:1
【戻り値】
常に true を返します。
下記はコード例です。ウィジェットの初期化をするアクションフック widgets_init で、ウィジェットエリアを登録する関数を追加しています。
1 2 3 4 5 6 7 8 9 |
function my_add_widgets() { register_sidebar(array( 'name' => 'フッターエリア', 'id' => 'footer-widgets', 'before_widget' => '<div class="footer-widget-area">', 'after_widget' => '</div>', )); } add_action('widgets_init', 'my_add_widgets'); |
アクションフックに追加されている関数を削除
用意されているアクションフックでは、WordPress はあらかじめいくつかの関数を登録し処理を実行させていますが、remove_action() を使って、その関数を削除し実行を停止することができます。
例えば、テンプレートタグ wp_head() を読み込むと、アクションフック wp_head が実行されますが、そこに追加されている主な関数は以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// REST API filters. add_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 ); // Actions. add_action( 'wp_head', '_wp_render_title_tag', 1 ); add_action( 'wp_head', 'wp_enqueue_scripts', 1 ); add_action( 'wp_head', 'wp_resource_hints', 2 ); add_action( 'wp_head', 'feed_links', 2 ); add_action( 'wp_head', 'feed_links_extra', 3 ); add_action( 'wp_head', 'rsd_link' ); add_action( 'wp_head', 'wlwmanifest_link' ); add_action( 'wp_head', 'locale_stylesheet' ); add_action( 'wp_head', 'wp_robots', 1 ); add_action( 'wp_head', 'print_emoji_detection_script', 7 ); add_action( 'wp_head', 'wp_print_styles', 8 ); add_action( 'wp_head', 'wp_print_head_scripts', 9 ); add_action( 'wp_head', 'wp_generator' ); add_action( 'wp_head', 'rel_canonical' ); add_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 ); add_action( 'wp_head', 'wp_custom_css_cb', 101 ); add_action( 'wp_head', 'wp_site_icon', 99 ); // Theme. add_action( 'wp_head', '_custom_logo_header_styles' ); // Embeds. add_action( 'wp_head', 'wp_oembed_add_discovery_links' ); add_action( 'wp_head', 'wp_oembed_add_host_js' ); |
これらの関数の中には、Web ページの head 要素内にタグを自動出力しているものがありますが、それらのタグ出力を抑制したい場合もあります。
そこで、WordPress バージョンを出力する wp_generator や、RSS フィード/コメントフィードを出力する feed_links/feed_links_extra を削除するには下記コードを functions.php に記述します。引数は add_action() で追加されたとおりにします。
1 2 3 |
remove_action( 'wp_head', 'feed_links', 2 ); //RSSフィードを出力しない remove_action( 'wp_head', 'feed_links_extra', 3 ); //コメントフィードを出力しない remove_action( 'wp_head', 'wp_generator' ); //WPバージョンを出力しない |
フィルターフックの使い方
【参考ページ】
Plugin Handbook - Filters
フィルターフック一覧
フィルターフックもアクションフックと同様、一般的には WordPress があらかじめ設置しているフィルターフックを利用します。
WordPress が設置しているフィルターフックの一覧は、下記ページをご覧ください。
例えば、the_title や the_content など、投稿や固定ページの編集画面で入力したデータをフィルターするフックが用意されています。
Codex 日本語版 - プラグインAPI/フィルターフック一覧
Codex - Plugin API/Filter Reference
WordPress Hooks Database
フィルターフックの適用
フィルターフックは、関数 apply_filters() によって適用されます。アクションフックと同様、独自のフィルターフックを設置することもできますが、WordPress が設置しているフィルターフックは、コアファイルのどこかでこの関数を使用し実装されています。
フックする関数の登録
functions.php に記述します。
フックする関数の定義をし、関数 add_filter() を使ってフィルターフック名とフックする関数を指定します。
add_filter() の書式は下記になります。
add_filter( $hook_name, $callback, $priority = 10, $accepted_args = 1 )
【パラメーター】
$hook_name
フックされるフィルターフック名。
$callback
フィルターフックが呼び出されたときに実行される関数。
$priority
フィルターフックに追加されている関数が実行される優先順序を指定します。小さい数値ほど早く実行され、同じ優先順位の場合はフィルターフックに追加された順序で実行されます。
初期値:10
$accepted_args
フックした関数が受け入れられる引数の数。
初期値:1
【戻り値】
常に true を返します。
コールバック関数では、引数で受け取った変数の内容を変更して返すか、変更後の値を返します。ただし引数と戻り値は同じ型でなければいけません。
引数は apply_filters() でどのようにフィルターフックを実装しているかに依存します。
フィルターフックの実装状況は、Code Reference で確認してください。
下記に functions.php に記述するコード例を示します。投稿タイトルを加工するフィルターをかけています。
なお、フィルターフック the_title には $title と $id の2つの引数がありますが、この例では $id は使用しないため省略することも可能です。その場合は add_filter() に指定する引数オプションはデフォルト値の1を適用するため記述しません。
1 2 3 4 5 |
function my_modify_title( $title, $id ) { $title = "WordPress特集 - " . $title; return $title; } add_filter( 'the_title', my_modify_title, 10, 2 ); |
フィルターフックに追加されている関数を削除
remove_filter() を使って、追加されている関数を削除し実行を停止することができます。
下記は、フィルターフック the_content からテキストを自動整形する関数 wpautop() を削除するコードです。
1 |
remove_filter( 'the_content', 'wpautop' ); //自動整形を停止 |
falseを返す関数
フィルターフックに false を返すと、そのフィルターを無効にできます。
WordPress には false を返す関数 __return_false() が定義されています。
例えば、WordPress では本文内に入力されたテキストの一部を自動的に変換する機能があるのですが、その機能を停止するにはフィルターフック run_wptexturize に false を返します。
下記コードを functions.php に記述します。
1 |
add_filter( 'run_wptexturize', '__return_false' ); |
ちなみに false を返す関数の他にも、true を返す関数や空の文字列を返す関数など全部で6種類が定義されています。
__return_true
__return_false
__return_zero
__return_empty_array
__return_null
__return_empty_string
例として、WordPress のすべての自動更新を無効にするには、下記コードを記述します。
1 |
add_filter( 'automatic_updater_disabled', '__return_true' ); |
«次の特集記事»
«前の特集記事» コンテンツのインポート・エクスポート
スポンサーリンク