WordPressで複数のカスタム投稿タイプを運用している場合、それぞれの投稿タイプに特化した検索フォームを設置することで、ユーザーの利便性を向上させることができます。本記事では、投稿タイプごとに異なる検索フォームを作成し、検索結果も対応させる方法を解説します。
検索フォームの基本構造を理解する
WordPressの検索フォームは、通常以下のような構造になっています。
<form role="search" method="get" action="<?php echo esc_url(home_url('/')); ?>">
<input type="search" name="s" placeholder="検索ワード">
<button type="submit">検索</button>
</form>
このフォームでは検索キーワード(s)のみを送信しており、投稿タイプの指定がなければ、postとpageの両方が検索対象になります。
カスタム投稿タイプを指定する検索フォーム
検索対象を特定のカスタム投稿タイプ(例:news)に限定するには、フォームにpost_typeを追加します。
<form role="search" method="get" action="<?php echo esc_url(home_url('/')); ?>">
<input type="search" name="s" placeholder="ニュースを検索">
<input type="hidden" name="post_type" value="news">
<button type="submit">検索</button>
</form>
このようにすることで、検索結果はnews投稿タイプのみに絞り込まれます。
複数の検索フォームを使い分ける実装例
例1:投稿タイプ news 用の検索フォーム
<?php get_search_form('news'); ?>
ファイル名:searchform-news.php
<form role="search" method="get" action="<?php echo esc_url(home_url('/')); ?>">
<input type="search" name="s" placeholder="ニュースを検索">
<input type="hidden" name="post_type" value="news">
<button type="submit">検索</button>
</form>
例2:投稿タイプ product 用の検索フォーム
<?php get_search_form('product'); ?>
ファイル名:searchform-product.php
<form role="search" method="get" action="<?php echo esc_url(home_url('/')); ?>">
<input type="search" name="s" placeholder="商品を検索">
<input type="hidden" name="post_type" value="product">
<button type="submit">検索</button>
</form>
検索結果テンプレートの出力制御
検索結果が投稿タイプごとに異なる表示を必要とする場合、search.phpでは以下のように振り分けが可能です。
<?php
$post_type = get_query_var('post_type');
if ($post_type === 'news') {
get_template_part('search-results/news');
} elseif ($post_type === 'product') {
get_template_part('search-results/product');
} else {
get_template_part('search-results/default');
}
?>
注意点:検索結果が表示されないときは?
検索条件が正しく指定されていない、または該当投稿タイプに公開済みの投稿がない場合、検索結果が表示されないことがあります。以下を確認しましょう。
- post_type の値がカスタム投稿タイプのスラッグと一致しているか
- カスタム投稿タイプが public => true で登録されているか
- 投稿のステータスが publish であるか
まとめ
カスタム投稿タイプごとに専用の検索フォームを用意することで、検索精度を高め、ユーザー体験を向上させることが可能です。検索フォームとテンプレートの使い分けにより、柔軟な設計が実現できます。サイト構成に合わせて適切に設置してみてください。