【WordPress】ページ内で検索結果を投稿タイプごとに分ける方法

  WordPressの検索機能をカスタマイズする方法は様々あります。
  
今回はページ内で、検索結果を投稿タイプごとに分ける方法をご紹介します。
search.phpでサブループを作成する
完成は下記のイメージです。 別々に検索結果が出るようにしたいと思います。
search.php内で下記のコードを用いてサブループを作成します。
  
    <?php $custom_query = new WP_Query(
      array(
        'post_type' => 'custom',
        's' => get_search_query(),
        'orderby' => 'rand', //ランダムに
        'posts_per_page' => 8, //8件
        )
        ); ?>
  
ポイントは2点です。
- ‘post_type’ => ‘custom’
 - ‘s’ => get_search_query()
 
  ‘post_type’ => ‘custom’
上記のコードのcustomの部分をカスタム投稿タイプのスラッグにしてください。
  ‘s’ => get_search_query()
‘s’というのはwp_queryのパラメータの一つで検索語にマッチする投稿を表示します。
そしてget_search_query()によって検索された文字列を取得します。
参考:関数リファレンス/WP Query
WP_Queryのパラメータによってどんな投稿を取得できるか指定できるのでWP_Queryのリファレンスは何度も確認しています。
関数リファレンス/WP Query
上記のサブループを用いることで検索結果を投稿タイプごとに1ページで分けることができます。
例えば下記のようなphpを書くとsectionごとに検索結果のループを変える事ができます。
  
    // デフォルトの投稿
    <section>
      <?php $default_post_query = new WP_Query(
        array(
          'post_type' => 'post',
          's' => get_search_query(),
        )
      ); ?>
      <?php
      if ($default_post_query->have_posts() ) :
      ?>
      <?php
      while ( $default_post_query->have_posts() ) :
        $default_post_query->the_post();
      ?
      // ここでデフォルトの記事を表示する
      <?php endwhile; endif; ?>
      <?php wp_reset_postdata(); ?>
      </section>
      
      // カスタム投稿タイプの投稿
      <section>
        <?php $custom_query = new WP_Query(
          array(
            'post_type' => 'custom',
            's' => get_search_query(),
          )
        ); ?>
        <?php
        if ($custom_query->have_posts() ) :
        ?>
        <?php
        while ( $custom_query->have_posts() ) :
          $custom_query->the_post();
        ?
        // ここでカスタム投稿タイプの記事を表示する
        <?php endwhile; endif; ?>
        <?php wp_reset_postdata(); ?>
    </section>
  
検索結果に出す投稿タイプを編集する
おまけですがfunctions.phpに下記のコードを追加すると検索結果に出力する投稿タイプを編集できます。
  
    function custom_search($query) {
      if ($query->is_search() && $query->is_main_query() && ! is_admin()) {
        $query->set('post_type', array('post', 'page', 'work', 'hobby'));
        return $query;
      }
      add_filter('pre_get_posts', 'custom_search' , 10 , 1);
    }
  
$query->set(‘post_type’, array(‘post’, ‘page’, ‘work’, ‘hobby’));のarrayの部分にカ出力したい投稿タイプのスラッグを入れます。
arrayで記述している投稿タイプのみが検索結果に出力されるようになります。
hobbyというカスタム投稿を出したくない場合hobbyを消すことでデフォルトの投稿、デフォルトの固定ページ、workというスラッグのカスタム投稿タイプのみが検索結果に出るようになります。
まとめ
サイトによっては検索機能が大変重要な場合もあります。
今回のようにサブループやfunctions.phpの記述等による検索のカスタマイズの引き出しもたくさん持てるとよいと思います。
