WordPressのフックを使いこなしてクエリを自由自在に操作しよう

ブログ

2018.10.10 コーディング

WordPressのフックを使いこなしてクエリを自由自在に操作しよう

WordPressを用いた制作をしていると、こんなことしたいなできたらいいな(チラッ)とリファレンスを読むとほとんどの場合それを実現するための関数やオプションが用意されておりWordPress様様という感じになるのだが、とは言えどうしても標準の関数の機能では実現できないケースに遭遇することがままある。

そんなかゆいところをなんとかするために、WordPressの多くの関数にはフックと呼ばれるものが用意されており、これを用いることで関数の動作をカスタマイズすることができる。

フックとは、端的に言ってしまえば「ある関数を実行する前にある処理を追加する」ためのものである。

もっともメジャーなフックとしてはpre_get_postが挙げられるだろう。archive.phpなどに自動的に発行されるクエリを改変するためのフックだ。

archive.phpにループ文を書くと、WordPressの管理画面で設定した「1ページに表示する最大投稿数」分だけ記事が表示されるわけだが、この設定を上書きできたりする。

例えば「Aという投稿タイプのアーカイブでは10件表示、Bという投稿タイプのアーカイブでは20件表示」といった柔軟なカスタマイズが可能になる。

投稿タイプを指定して表示件数を変更

上述の例などはよくあるパターンなので調べればすぐに分かることだが、少々マニアックなカスタマイズを実装したので紹介する。

やりたかったことは、記事シングルページに存在する「次の記事」「前の記事」の表示の中から、パスワードで保護されたものは除外したかった。

前後の記事を取得するには一番簡単なのはget_next_post, get_previous_postを使うことだが、これだとカテゴリやタクソノミーを絞り込むオプションしかなく「パスワードで保護されたものは除外」とかってことができそうになかった。

そこで出てくるのが、get_adjacent_postだ。先述のget_next_post, get_previous_postの内部で使われている親関数みたいな感じ。

こっちだとフィルターフックが使えるので、パスワードが空のもの(パスワードがかかっていない)って条件を追記すれば実現できそうだ。

こんな感じ。get_adjacent_postが実行される際に発行されるクエリにAND p.post_password = ”とパスワードが空って条件を足しただけ。

冒頭で述べたようにWordPressは大抵のことは標準装備で実現できてしまうので、WordPressばかり触っているとWeb制作はできるけどSQL全然書けないとかってなりがちである。今回紹介したような細かい要望にも応えられるよう、フックの仕様とSQLは学習しておくといいだろう。

逆に普段WordPressを使わないエンジニアがWordPressで開発すると、WordPressの標準関数で一発なところをわざわざ自作関数を書いているケースが見受けられる。これは明らかに工数のムダなので、仕様と機能を把握して、再利用できるものは積極的に使っていこう。

CONTACT
お問い合せ・お見積りはこちらから
  • 03-6279-3013 お問い合わせは 月~金 10:00~19:00

  • メールでのお問い合せはこちら