pre_get_postsを使ったカスタムタクソノミーの複雑な条件検索

この記事のコードはちゃんと動いてませんでした。近日中に修正いたします。

2014.04.03追記:
修正版書きました

以前カスタムタクソノミーを好みの条件で検索する方法として、カスタムタクソノミーを使った複雑な条件検索というエントリーを書きました。
当時は$_GETで得た値をtax_queryに突っ込むという方法を取っていましたが、$_GETを直接取得するというのは明らかにダサいですしWordPressらしくもありません。

そこで検索に用いるタクソノミー名をクエリオブジェクトより取得する方法を改めて考えてみました。ついでに通常のループ+pre_get_postsで取得できるようにしてみました。

DEMO(実際に検索できます)

AD

カスタムタクソノミー定義時の注意

カスタムタクソノミーはregister_taxonomy関数で定義しますが、その際「query_var」というオプションをtrueにセットします。
そうすることで定義したカスタムタクソノミー名をクエリとして扱うことが出来ます。

テンプレート(index.php,search.phpなど)に記述する内容

検索フォーム部分はnameにカスタムタクソノミーの名称、valueにそれぞれのタクソノミーの内容の名前(分かりにくい言い回しですが・・・)を入力します。
ループ部分はpre_get_postsフィルタを使う場合、while部分以外の記述は必要ありません。

functions.phpに記述するフィルターフック

$query->queryをvar_dumpなどで見てみると分かりやすいのですが、単にフォームからのGET値が入っているわけではなく、GETで送られてかつカスタムタクソノミーとして定義している値のみがqueryとして保持されています。

この$query->queryを使ってtax_queryを生成します。

AD

Share

Commentsコメント

メールアドレスは公開されません。コメントは必ずご入力ください。

HTMLタグは使用できません。ソースコードを書き込みたい場合はCodetterGistCodePenなどのご利用が便利です。

のあ さんより
こんにちは。
以前投稿していた旧Verでは、条件検索ができたのですが、
このソースをそのまま使用し、試した所404エラー等が連発してしまいました。
管理人 さんより
のあ 様
コメントありがとうございます。
このソースそのままで実際に動かしてみたところ私の環境では動いておりますので(http://wood-roots.com/test/ 念のためWP3.8.1にアップデートしました)、動作しないのでしたらエラーのもう少し詳しい状況をお伝えいただけますと解決も早いかと思います。

たとえば、

・WordPressはどのバージョンを使っているのか
・実際に表示されるエラーメッセージはどのようなものか(ini_set( 'display_errors', 1 );を記述していないとメッセージは表示されません)
・どのタイミングでエラーが表示されるのか(ページにアクセスしたとき?検索を実行した時?)

などの情報が分かるとどこで問題が発生しているのか原因究明が捗ります。

また、可能であれば設置して動作していないサイトのURLをお伝えいただければなおいいかと思います。
のあ さんより
ご丁寧にご返信ありがとうございます。
Wordperssのバージョンは3.8.1を使用しております。
また、エラーではないのですが、  検索する ボタンを押したあとでも該当する記事が表示されない状態となっております。

ID:***********
Pass:**********
管理人 さんより
のあ 様
コメントありがとうございます。

誠に申し訳ありません。いただいたパスワードでテーマを直接変更して見ていたら記述をミスってしまい、更新作業ができなくなってしまいました。。。。
お伝えいただいたサイトもエラーで表示されない状態になっているかと思います。
修正していたのはfunctions.phpなので、おそれいりますが再度アップロードしていただけますでしょうか。

本当にすいません。。。。
のあ さんより
お手数をおかけいたします^^;
先ほど元のファイルに戻しましたので、よろしくお願いいたします。
管理人 さんより
のあ様
テスト用のサーバのfunctions.phpを改造させていただき、おそらく思い通りの動作ができるようになったのではないかと思います。

http://n0ahrt.xsrv.jp/

※ID、Passはテストサーバとはいえ公開しておくのはまずいと思うので編集させていただきました。

当記事に書いている内容でもエラー出力させてみるとエラーまみれだったりよく見たら動作がおかしかったりしたので、記事も近日修正いたします。。。

修正箇所はfunctions.phpのみで、コメントを入れていますので参考にしてみてください。
のあ さんより
Morimoto様お忙しい所ありがとうございました!
大変勉強になります。
今後ともよろしくお願いいたします。