WordPressでよく使用するアクションフックとフィルターフックの実例3選
ブログを作る、コーポレートサイトを作る、様々なWebコンテンツを作る際に利用されているWordPressですが、開発中に
「投稿が更新された時にこの処理をしたい」
「自動で出ているこの表示をカスタマイズしたい」
「デフォルトだとこの挙動だけど、ページの種類や個別毎に挙動を変えたい」
などとデフォルトの挙動をカスタマイズしたい箇所が出てきます。
以下のように実現するだけならばできます。
- もちろん投稿が更新された時に処理をしたければcronでMySQLを監視して投稿テーブルが増えたら処理をするPHPを書く
- 表示をカスタマイズしたければそのページ上で
JavaScriptを使用して表示を変える - ページごとに挙動を変えたければページのテンプレートにPHPで処理を書く
しかし、開発者はCMSやフレームワークの想定されている処理以外はできれば使いたくないし、JavaScriptで無理やり表示を変えたら他への影響が怖いし、ページごとの処理はまとめておきたいものです。もちろん仕様と工数と期限の範囲内で。
そこで、WordPressにはアクションフックとフィルターフックというWordPress内の処理にフックした処理やデフォルトの挙動に処理を追加できる機能があります。
今回は、まずアクションフックとフィルターフックの基本的な使い方。次に、WordPress開発で経験してきたアクション・フィルターの使用例を実際のケースと共にご紹介いたします。
なお、この記事はWordPressのカスタマイズに関して、ある程度理解している方向けへの内容となります。ご了承ください。
アクションフック、フィルターフックの使い方
まず両者の基本的な使い方を見てみましょう。
記述するソースは使用しているテーマフォルダのfunctions.phpですが、私はよく実処理をfunctions というディレクトリを作って、その中でファイルごとに処理を記述し、functions.phpにはinclude onceのみを記述しています。
基本的に両者の書き方は同じです。
上記の例はフィルターフックですが、コレがアクションフックだと「add_filter」が「add_action」に変わります。
両者の違いとして、アクションフックはWordPressの特定のタイミングで独自の関数で何らかの処理を行う、フィルターフックはWordPressの処理の途中で出力する内容をカスタマイズするというものがありますが、明確な違いは「値(データ)を受け渡しするかどうか」です。
アクションフック
アクションフックは基本的に値を受け渡しません。前述したとおり、WordPressの特定のタイミングで独自の処理を登録するためのものなので、処理は完結しており値を返す必要がありません。
例として下記の処理を御覧ください。
こちらはwp_head関数が呼び出された時にscriptタグを出力する処理です。
wp_headアクションフックにadd_head_custom_tags関数を登録しています。
wp_head関数は基本的に全ページのheadタグを出力する時に呼ばれますので、これで全ページのheadタグの中に「」が出力されることになります。「is_home()」や「is_page()」などの標準関数も呼ぶことができるのでTOPページはコレ!個別ページはコレ!など出し分けることも可能です。
add_action関数の第三引数(上記では99)は同一フックに複数の関数が登録された時に呼び出される優先順位を表します。省略時の初期値は10で、数が小さい方が先に呼ばれます。
フィルターフック
フィルターフックは値を受け渡します。WordPressの処理の途中で出力するためのものであるため、引数でデフォルトの出力内容が入ってきており、カスタマイズして返り値とします。
例として処理を見てみましょう。
WordPressが長文を省略する時に出力される文字列(デフォルトでは「…」)を修正する処理です。
excerpt_moreフィルターフックにnew_excerpt_more関数を登録しています。
例では引数を使用していませんが、カスタマイズした値がreturnされています。これで長文を省略した際に該当の投稿ページへの「続きを読む」リンクが出力されます。
アクションフックと同じく第三引数に整数を入れれば同フック内の優先順位を定義できます。
実装例
では、実際に使われたアクションフック・フィルターフックを、それぞれのケースと共にご紹介します。なお、一部分は修正しているのでご了承ください。
【ケース1】一覧ページのソート順を更新が新しい順にしたい
一覧ページの表示順を投稿の更新順にしたいそうです。デフォルトでは投稿順ですからね。では処理を見てみましょう。
こちらはアクションフックです。
投稿を取得するget_posts関数の処理の前に呼ばれる「pre_get_posts」フックに処理を登録しています。引数でget_postsに与えられた条件が$queryに入っているのでそれを変更してあげれば良いです。
こちらのフックは管理画面でも呼ばれますので
is_admin()で管理画面かどうか、メインのクエリではない場合には影響がないようにしています。
【ケース2】記事抜粋を50文字表示にしたい
今度はデフォルトの記事抜粋が長いそうです。ちなみにWordPressのデフォルトは110文字です。
こんなのもラクラク修正できます。それぞれ記事の抜粋が表示されるテンプレートで文字列を切り取ることもできますが大変です。
もちろん標準関数を使えばページ毎に文字数を変えることもできますよ。
【ケース3】タクソノミーの登録情報でリライトルールを作りたい
「タクソノミーで登録されている都道府県でリライトルール作りたいな…でも47行リライトルールを書くのは嫌だし…」
確かに47行のリライトルールを書くのはエンジニアとしては嫌ですよね。正規表現で記述したとしても結局47単語書かなければいけません。何よりタクソノミーとして既に登録されているのですからそれを使わない手はないです。
まず、タクソノミーとして都道府県名を登録しておきます。この時スラッグにはURLに使う英数字を入れておきます。
そして下記の様なアクションフックを登録します。
get_terms関数で登録したタクソノミーを取得し、スラッグを使って正規表現用の文字列を作成
(hokkaido|aomori|…)。そしてadd_rewrite_ruleでリライトルールに追加しています。
この例だと、「http://[ドメイン]/hokkaido/」にアクセスした時に「pref_postというスラッグの固定ページ」に「キー:pref、値:hokkaidoのクエリパラメータ」を渡す様になっています。固定ページの作り方やカスタムクエリパラメータの追加方法は本筋とは逸れますので割愛させていただきます。
ちなみにinitアクションフックは通常プラグインの初期化時に処理が実行されるアクションフックです。
今後ありえるかはわかりませんが、もし都道府県が増えた時にもタクソノミーを追加するだけで自動でリライトルールに適用してくれますね。
最後に
今回はWordPressのカスタマイズ時に使用したことのあるアクションフック・フィルターフックをご紹介させていただきました。
この他にもWordPressには沢山のフックが標準実装されています。今回は割愛させていただきますが、更に独自でフックを作ることも可能です。標準実装されているフックについては公式のWordPressCodexに詳しいのでぜひご参照ください。
参考
参考
WordPressは非常にメジャーなCMSで携わることになる開発者も多いかと思います。この記事が「こんな仕様を実現できないか…」「どう実装すればいいかわからない…」などの開発者の一助になることを願います。
この記事を書いた人
クーシーブログ編集部
1999年に設立したweb制作会社。「ラクスル」「SUUMO」「スタディサプリ」など様々なサービスの立ち上げを支援。10,000ページ以上の大規模サイトの制作・運用や、年間約600件以上のプロジェクトに従事。クーシーブログ編集部では、数々のプロジェクトを成功に導いたメンバーが、Web制作・Webサービスに関するノウハウやハウツーを発信中。
お問い合わせはこちらから
Web制作デザイン、丸ごとお任せ
お問い合わせする
星