特定のカスタム投稿タイプを検索(キーワード検索)
通常のwordpressのキーワード検索を、特定の投稿タイプのみに限定して行う方法。
この1行を検索フォームに入れる。これだけ。
<input type="hidden" name="post_type" id="post_type" value="投稿タイプ名">
ここで指定したパラメーターは「 post_type => ‘投稿タイプ名’ 」としてメインクエリーに持ち越され、検索結果から指定投稿タイプのみを抽出する。
特定のカスタム投稿タイプを絞り込み検索(キーワード以外)
カテゴリーやタクソノミー、カスタムフィールド等で絞り込み検索を行う方法。
具体的な絞り込み処理の方法は、いつもお世話になるこちらのサイトが大変詳しい。
http://kotori-blog.com/wordpress/refinement_search/
この処理を行う流れは、下記2つがある。
- search.phpテンプレート内で検索要件に適合した投稿を抽出する
- pre_get_postsを使って検索要件に適合したメインクエリーを作成する
また、諸般の事情により、キーワード検索では検索フォーム内の識別用引数を「’post_type’ = ‘投稿タイプ名’」としていたが、「’search_for’ = ‘投稿タイプ名’」に変更する。これはどちらの方法でも同じ。
検索フォーム
<input type="hidden" name="serach_for" id="serach_for" value="投稿タイプ名">
1. search.php テンプレート内で処理
search.phpには下記のようにする。
if( $_GET['serach_for'] == '投稿タイプ名'){ 指定投稿タイプのみの検索結果 …wp_queryでタクソノミー絞り込みのクエリーを作成 } else{ それ以外の検索結果 }
2. pre_get_postsで処理
pre_get_posts 設定箇所を下記のように記載。
(eventをコース、インストラクター、開催地域の3つのタクソノミーで絞り込む場合)
functions.php
/* カスタムクエリーを設定 -------------------------------------------- */ function custom_query($query) { //////// 検索ページ //////// if( is_search() ){ // イベント検索の場合のみ以下 if( $_GET['serach_for'] == '投稿タイプ名'){ // 変数を取得 $taxo_course = $_GET['taxo_course']; //コース $taxo_instructor = $_GET['taxo_instructor']; //インストラクター $taxo_area = $_GET['taxo_area']; //地域 // 検索条件が指定されている時のみ実行 if( $taxo_course || $taxo_instructor || $taxo_area ){ // タクソノミー設定 if($taxo_course){ $taxquerysp[] = array( 'taxonomy'=>'event_course', 'terms'=> $taxo_course, 'field'=>'slug', 'operator'=>'AND', ); } if($taxo_instructor){ $taxquerysp[] = array( 'taxonomy'=>'event_instructor', 'terms'=> $taxo_instructor, 'field'=>'slug', 'operator'=>'AND' ); } if($taxo_area){ $taxquerysp[] = array( 'taxonomy'=>'event_area', 'terms'=> $taxo_area, 'field'=>'slug', 'operator'=>'AND' ); } $query->set( 'tax_query' , $taxquerysp ); $query->set( 'post_type' , '投稿タイプ名' );// 投稿タイプの指定 …その他クエリーを記述 }// end:検索条件が指定されている時 return; }// end:イベント検索 }// end:検索ページ } add_action( 'pre_get_posts', 'custom_query' );
search.php の記述
if( $_GET['serach_for'] == '投稿タイプ名'){ //カスタム投稿タイプの検索結果 if( have_posts() ):while( have_posts() ):the_post(); //表示内容を記述 } else{ //それ以外の検索結果 }