フックについて調べる経緯
WordPressでカスタマイズする、といえばテーマかプラグインについてだと思います。
WordPressがデフォルトで持つ機能といえば、管理画面で出来る機能です(当たり前ですが)。
機能拡張をしたいと思った場合、WordpressのコアファイルをカスタマイズするのはNGです。
コアファイルを変更せず、それぞれの処理契機に処理をねじ込んであげるのです。契機は既に豊富に用意されてます。
この方法で実現できないことは、そもそもWordpressにそのアプリケーションに向いてないと僕は解釈しています。
そしてその「ねじ込んであげる」機能を「フック」と呼びます。
WordPressのフックとは
フックとは、Wordpressの処理フローの各所に独自の処理をhook(引っかけるって意味らしい)事ができる機能です。
このフックについて詳しく見ていきたいと思います。
ただ、概要を読んでもいまいちピンとこないんで実際に利用もしてみようと思います。
プラグインAPI
プラグインAPIという名前からプラグインのために用意された仕組みっぽく感じますが、
これはプラグインに限らず、Wordpressにおける、処理を追加・変更するためのAPI(Application Programming Interface) です。テーマでも使用します。
詳しい概要はこちらを参照していただくといいと思います。
2種類のフック
繰り返しになりますが、フックとはWordpressの処理のポイントに別の処理を引っかけて(フックして)動作を変更・追加するWordpressの仕組みのことです。
そしてフックには、「アクションフック」と「フィルターフック」の2種類があります。
以下、公式より抜粋。
2.フィルター: フィルターは、データベースに追加する前やブラウザのスクリーンに送り出す前にさまざまなタイプのテキストを改造するために WordPress が起動させるフックです。プラグインは、フィルター API を使用して、これらのタイミングで特定のタイプのテキストを改造するために一つ以上の PHP 関数の実行を指定することがきます。
意味が分かりませんね。
ざっくり言うとアクションは処理を追加で、フィルターは処理を変更するとかなんとか。
サイトや本によって書いている内容が結構違います。まぁ最近はあんまり違いないよって本で呼んだので、それを信じようと思います。
ただ、確実な違いとしてフィルターは値を返すようです。
構文の確認
とりあえずアクションフックを使用するための、add_filter()関数の構文を見ていきたいと思います。
引数名 | 型 | 説明 | デフォルト値 |
$tag | string | フック名 | ー |
$function_to_add | callable | フックする関数 | ー |
$priority | int | 実行優先順。値が小さいほど先に実行される | 10 |
$accsepted_args | int | フック関数が受け付ける関数の数 | 1 |
そのまんまですが、第一引数「$tag」で処理を追加するフックの名前を指定します。
第2引数「$function_to_add」で追加する処理の名前を指定します。
第3引数「$priority」には優先順位です。値が小さいほど先に実行されます。ってことは同じフックに複数の処理をひっかけることができるみたいですね。省略可能です。
第4引数には引数の値を記述します。フックによって関数が受け取る引数の値は様々なようです。その場合、状況に合わせて引数の数を入力してあげる必要があります。省略可能ですが、フックによっては省略できないものもあるのかな?
とりあえず動きを見てみよう!
フックポイントは以下のリンクで確認できます。
ちなみに実際の開発時は影響範囲の確認や拡張性の考慮を考える必要があると思いますが、割愛しているのでご注意を。
とりあえず簡単そうな例から実際に使ってみます。
「新規投稿時のタイトル」欄のplaceholderが現在は「タイトルを入力」ですが、「タイトルが未入力です」に変更したいと思います。
ってことで先述のWordpressの公式から「新規投稿」で検索してみます。
新規投稿にかかわるフックは以下の3点。
カスタマイズしたい項目はタイトルなので使用するフックは3つ目の「default_title」ですかね。
これを利用したコードを使用テーマのfunctions.phpに記述してみます。
return 'タイトルが未入力です';
}
add_filter('default_title', 'my_the_title');
狙い通り「タイトルが未入力です」に変わりました、と思いきや…
見た感じでは分かりにくいですが、上の画像はタイトルが入力済みになってます。
目的はプレースホルダーにタイトルを自動入力することではなく、未入力の際の文字列の変更なので、これではだめですね。
このフックポイントを利用すると新規登録の際にタイトルを自動入力するみたいです。
プレースホルダー内の文字列を変更するための正しい記述は以下でした。
function my_the_title() {
return 'タイトルが未入力です';
}
add_filter('enter_title_here', 'my_the_title');
これで以下のように変更されました。
今回利用した「enter_title_here」フックポイントは公式の日本語版では出てきませんでした。
公式のdeveloperにはあったんだけどなぁ。
正しいかは分からないけど、以下のようにして調査を行いました。
VSCodeでWordpress全体を開いて、「ここにタイトルを入力」で検索。
すると辞書ファイルが検索で引っかかるので、それを元に実際のテキストが入力されているファイルを確認(wp-admin/edit-form-advanced.php:571行目)。
これで使用されているフックポイントがわかりました。
このファイル上で変更しても内容は書き換わりますが、Wordpressのコアファイルを書き換えるのは基本無し(更新の際に消えちゃう&管理しきれなくなるとか諸々)なので、
現在使用中の子テーマに先述のコードを記述して完了です。
まとめ
フックポイントの使い方ですが、今回は簡単な例なので、実際の開発で応用が利くかは微妙なところがありますが、
基本的には、実行したいタイミングのフックを見つけ、実行したい処理をねじ込むって感じのイメージです。
あと冒頭にも書きましたが、フックポイントによっては影響範囲の大きいものもあると思うので、
その際は引数で優先順位を設定したり、remove_filter関数を使ってadd_filterを取り消すことができるので、
整理しながらカスタマイズ出来ていけたら理想的ですね。
フックポイントの探し方ですが、Wordpressは情報が豊富なので検索したら大体の情報は出てくると思います。
見つからない場合は、ソースコードを検索したりフックポイントを確認できるプラグインを利用したりするのもいいかもしれません。
開発を通して壁にぶちあって、経験を積んでいきたいと思います。