特定のカスタム投稿タイプに絞って、サイト内検索をする方法についてご紹介します。

検索入力フォームの設置

まずは検索フォームの設置からです。
下記コードを任意の場所に記述します。

<form action="<?php echo home_url(); ?>" method="get">
  <input type="text" name="s" value="<?php the_search_query(); ?>" placeholder="検索する">
  <input type="hidden" name="post_type" 
  value="<?php echo esc_html(get_post_type_object(get_post_type())->name); ?>">
 <button>送信する</button>
</form>

inputタグのhiddenタイプを使って、サーバーにカスタム投稿タイプの情報を送り、検索対象を限定します。
value属性にはカスタム投稿タイプのスラッグを入れます。

カスタム投稿タイプのスラッグを取得

<?php echo esc_html(get_post_type_object(get_post_type())->name); ?>

こちらのコードをvalue属性に入れることで、表示ページのカスタム投稿タイプを当てはめてくれます。
複数のカスタム投稿を実装している場合に、検索対象を特定のカスタム投稿タイプに限定したい時に便利です。

get_post_type_object(get_post_type())->name → カスタム投稿タイプのスラッグを取得
esc_html() → エスケープ処理を行う関数

複数のカスタム投稿タイプから検索したい場合

<input type="hidden" name="post_type[]" value="news">
<input type="hidden" name="post_type[]" value="blog">

検索対象を複数にしたい場合は、name属性を配列post_type[]にして、value属性に対象のカスタム投稿タイプを入れてあげます。

検索結果ページの設置

search.php

検索結果ページはテンプレートファイル「search.php」を使用します。

<?php if( have_posts() ): ?>
  <h2>「<?php the_search_query(); ?>」の検索結果</h2>
    
  <?php while( have_posts() ): the_post(); ?>
    <ul>
      <li>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
      </li>
    </ul>
  <?php endwhile; ?>

<!-- 検索ワードがヒットしないとき  -->
<?php else: ?>
  <p>検索結果はありませんでした。</p>
  <p>再度サイト内検索、または下部リンクより目的のページをお探しください。</p>
<?php endif; ?>

検索結果が0件の時を考慮し、else文を使って記事がない場合の表示を記述しましょう。

検索ワードの取得

検索ワードは下記テンプレートタグで取得できます。

<?php the_search_query(); ?>