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>
post_typeはWordPress標準の公開クエリ変数(public_query_vars)に含まれているため、追加のコードを書かなくても、このhidden inputを送信するだけで検索結果はnews投稿タイプのみに絞り込まれます。
複数の検索フォームを使い分ける実装例
投稿タイプごとにフォームのファイルを分けて管理したい場合、get_template_part()を使うとテンプレートを切り替えられます。
<?php get_search_form('news'); ?>
<!-- 'news' という引数は無視され、常に同じsearchform.phpが読み込まれる -->
get_search_form()が受け取るのはecho・aria_labelを含む$args配列のみで、テンプレートは常にsearchform.php1ファイルしか探しません。文字列'news'を渡しても無視され、投稿タイプ別のテンプレートには切り替わりません。
スラッグ別のファイル({slug}-{name}.php → {slug}.phpの順で探す仕様)を切り替えたい場合は、get_template_part()を使います。
例1:投稿タイプ news 用の検索フォーム
<?php get_template_part('searchform', '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_template_part('searchform', '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 であるか
関連記事
よくある質問(FAQ)
まとめ
カスタム投稿タイプごとに専用の検索フォームを用意することで、検索精度を高め、ユーザー体験を向上させることが可能です。テンプレートを分ける際はget_template_part()を使い、検索フォームとテンプレートの使い分けにより、柔軟な設計を実現しましょう。サイト構成に合わせて適切に設置してみてください。

