個人的にはWPのwp_queryはかなり強力な仕組みだと思っている。
SQLなどを弄ばなくても大抵のサーチが出来る。
組み込み方は様々だが、一番スマートだと思っているのは’pre_get_posts’フックに$wp_query->set何々でパラメータを設定していくやり方。
こうすればテンプレートには一切手を加えず、お好みの検索を実現することができる。
ただ、少しハマったので記録。
タクソノミーと組み合わせた検索をしようとしたので、普通に
$wp_query->set(‘tax_query’ , $something);
などと組み込んで行ったところ、どうも検索結果が怪しい。
$wp_queryをダンプしてパラメータを見たところ、tax_queryに2度同じタクソノミーが登録されている模様。
なぜか?その原因はGETパラメータにあった。
GETパラメータにタクソノミー・スラッグと同名のキーがあったので、ここからwp_queryが勝手に引っ張ってきてtax_queryにセットしてしまっている。
要するに、自前でsetなどしなくてもWPは勝手にクエリに追加してくれる。賢い。
ただ、検索の値に手を入れたり、tax_queryのパラメータを細く設定したい場合この仕様は困る。
この場合、タクソノミーのquery_varをfalseにすれば回避できる。またカスタムのクエリキーを設定することもできるようだ。
ただ、タクソノミーなどの基本設定を変えたくない場合もあるだろう。その場合は、自前の検索ではリクエストキーの名前にアンダースコアを付けるなどして変えておくことによって、勝手にセットされることを防ぐことができる。
この問題は、普段なかなか気づかない。というのはクエリが重複しても検索結果に影響がないことが多いからだ。
しかし、重複していることによって確実に検索の負荷は増大し、ただでさえ重たいWPの検索がさらに耐え難くなる。
気づかずにとんでもない高負荷のサイトを作ってしまっている可能性があるので要注意だ。
個人的には、GETパラメータと予約語の絡みで大ハマりしたことは1度や2度ではないので、パラメータを決めるときには重複に注意すべきだと考えている(その注意を怠ったおかげでの気づきなのだが・・・)