【wordpress】カスタム投稿タイプの検索、タクソノミーでの絞り込み検索

特定のカスタム投稿タイプを検索(キーワード検索)

通常のwordpressのキーワード検索を、特定の投稿タイプのみに限定して行う方法。
この1行を検索フォームに入れる。これだけ。

<input type="hidden" name="post_type" id="post_type" value="投稿タイプ名">

ここで指定したパラメーターは「 post_type => ‘投稿タイプ名’ 」としてメインクエリーに持ち越され、検索結果から指定投稿タイプのみを抽出する。

特定のカスタム投稿タイプを絞り込み検索(キーワード以外)

カテゴリーやタクソノミー、カスタムフィールド等で絞り込み検索を行う方法。
具体的な絞り込み処理の方法は、いつもお世話になるこちらのサイトが大変詳しい。
http://kotori-blog.com/wordpress/refinement_search/

この処理を行う流れは、下記2つがある。

  1. search.phpテンプレート内で検索要件に適合した投稿を抽出する
  2. 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{
    //それ以外の検索結果
}

 

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください