2015
03/23

カスタムクエリの追加方法と一緒に追加しておきたい関数やフックなど

customquery

WordPressはURLパラメータによって記事を抽出することができます。
たとえば、以下のようにURLパラメータだけでpre_get_postsのフィルターフックを書いたときのような処理を行うことが可能です。

記事IDが20の記事を表示する
http://example.jp/?p=20

hogeというタグが追加された記事を表示する
http://example.jp/?tag=hoge

ただ、カスタムフィールドの内容で記事を抽出するmeta_queryやタクソノミーに対するtax_queryなどは、そのままでは行うことができません。

そこでURLパラメータを取得してmeta_queryなどの記事抽出を可能とする仕組みがカスタムクエリです。

カスタムクエリについてはWordPress Codexが詳しいです。
カスタムクエリ – WordPress Codex 日本語版

ADs

カスタムクエリを追加する

たとえば、記事に「’camera’,’f’,’mm’,’ss’,’strobo’,’iso’」というカスタムフィールドがあったとして、その内容によって記事を抽出したい場合を考えてみます。

必要な処理としては

1.カスタムフィールドのキーがURLパラメータとして認識されるようにする
2.そのURLパラメータ有りでアクセスされた場合、meta_queryによる記事抽出を行う。

という2点が必要です。

最低限必要な処理は以下のようになります。

functions.phpにこのように書いておけば、以下のURLでカスタムフィールドに「camera:canon」「f:2.8」「mm:50」というものを持つ記事の一覧が表示されます。

http://example.jp/?camera=canon&f=2.8&mm=50

カスタムクエリを追加した時に合わせて追加したい関数やフィルターフックなど

このままでも便利に使えるのですが、カスタムクエリを追加した際には以下のような関数やフックも追加しておくとさらに使い勝手が良くなります。

カスタムクエリの有無を判定する

追加したカスタムクエリが含まれたクエリかどうかを判定します。

カスタムクエリの有無でbody_class()が付加するクラスを追加・変更する

body_class()関数はそのとき表示されている記事によって様々なクラスを出力してくれる便利な関数ですが、カスタムクエリについてはクラスが付加されるなどの処理は行われません。そのままだと不便なのでクラス追加や削除などを行うといいでしょう。

以下の例はカスタムクエリ有りの場合は「meta」というクラスを追加し、同時に「home」クラスを削除します。

前述の

http://example.jp/?camera=canon&f=2.8&mm=50

のようなURLの場合、扱いとしてはトップページとなります(is_home()はtrueになります)。
ただ、カスタムクエリが含まれた場合はどちらかというとアーカイブとして扱ってほしいことのほうが多いのではないかと思いますので、その点を考慮して「home」を削除しました。

カスタムクエリの有無で読み込まれるテンプレートを変更する

カスタムクエリが存在する場合でもis_home()がtrueと判定されますので、読み込まれるテンプレートもhome.php(frontpage.phpやindex.phpの可能性もありますが)となります。

そこをカスタムクエリがある場合はarchive.phpを読むように変更します。

※トップページがhome.phpではない場合は「frontpage_template」や「index_template」へのフィルターフックになる場合もあります。

まとめ

カスタムクエリは使いこなすと複雑な検索を必要とするポータルサイトやカタログサイトなどの構築に大変便利です。
個人レベルでも大規模なサイト構築も夢ではないので、ぜひ挑戦してみてください。

ADs

Post Comments

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

Comments