pre_get_postに引数を渡す時は要注意な件。
かなりトリッキーな動き方をする。
やりたかったこと
カスタム投稿タイプ「event」の投稿を、複数のカスタムタクソノミーで絞り込み、検索結果をpre_get_postsを使って表示する。
- 検索フォームは<input type=”hidden” > でイベント検索識別用に「post_type=event」の引数を作る。これは「post_type=>’event’」としてメインクエリーに渡されるので、自動的に投稿タイプが絞り込まれる。
wordpress検索である事を認識させるパラメーター「s」も同時に渡す。 - タクソノミーによる絞り込みは、functions.php 内の pre_get_posts に is_search() の条件分岐を作り、その中に検索条件を反映させるクエリーを設定する。
- search.php 内は event絞り込み検索とそれ以外の検索を条件分岐で分けて結果を表示する。
検索フォーム
<input type="hidden" name="post_type" id="post_type" value="event"> // event検索と識別させる <input type="hidden" name="s" id="s" value=""> // 検索であると識別させる
function.php
///// pre_get_posts でテンプレート毎にクエリーを設定する箇所 ///// //event一覧ページのクエリー if( is_post_type_archive('event') ){ …ほにゃらら… } // 検索ページのクエリー if( is_search() ){ //event絞り込み検索の場合 if( post_tyep == 'event' ){ …ほにゃらら(検索条件絞り込みクエリー) } }
search.php
if( post_type >= 'event'){ event絞り込み検索の結果表示 } else{ それ以外の検索結果表示 }
結果
出力テンプレートはsearch.php を選択しているものの、どういうわけかpre_get_posts はevent一覧クエリーを取得する。
恐らくこういう事が起こっていたのだと推測される。
対策
引数で渡した「”post_type” = “event”」が「post_pye => ‘event’」のメインクエリーを作成したので、pre_get_posts で event一覧アーカイブページと認識されたものと推測。
なので、引数の「”post_type” = “event”」をメインクエリーに影響を与えない別のものにすれば良いだろう。
検索フォーム
<input type="hidden" name="search_for" id="search_for" value="event"> // ☆変更箇所☆ <input type="hidden" name="s" id="s" value=""> // 検索であると識別させる
function.php
///// pre_get_posts でテンプレート毎にクエリーを設定する箇所 ///// //event一覧ページのクエリー if( is_post_type_archive('event') ){ …ほにゃらら… } // 検索ページのクエリー if( is_search() ){ //event絞り込み検索の場合 if( $_GET['serach_for'] == 'event'){ …ほにゃらら(検索条件絞り込みクエリー) } }
search.php
if( $_GET['serach_for'] == 'event'){ event絞り込み検索の結果表示 } else{ それ以外の検索結果表示 }
これで上手くいった!
尚、絞り込みのためのクエリーの書き方は、いつもお世話になるこちらのサイトを参照のこと。
http://kotori-blog.com/wordpress/refinement_search/