カスタム投稿タイプを作るのは、役割を明確に区別したいからです。しかし、WordPressのサイト内検索をすると、カスタム投稿タイプをすべて横断して検索してしまいます。
個人的には、WordPressのサイト内検索は投稿タイプごとに区別して結果を返して欲しいと思っているので、今回はその方法を紹介していきます!
WP_Queryの概念が分かっていれば、すぐに実装できると思います!
サイト内検索を投稿タイプごとに限定させる方法
修正するテンプレートファイルは検索に関する以下の2点です。
- searchform.php
- search.php
それぞれのカスタマイズ方法を順番に見ていきましょう!
searchform.php
検索フォームから投稿タイプの情報を渡してあげる必要があります。これはWordPressの仕組みではありません。HTMLのフォームの仕様を理解していれば、思いつく内容かと思います。
具体的には以下の1行をフォーム内に追加してください。
<input type="hidden" value="<?php echo get_post_type(); ?>" name="post_type" id="post_type" />
全体像はこんな感じです。ここの記述方法はテーマによって異なると思いますが、上記の1行をフォーム内に追記すると覚えておいてください。
<form role="search" method="get" id="searchform" class="search-form" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<div>
<label class="screen-reader-text" for="s"><?php _x( 'Search for:', 'label' ); ?></label>
<input type="search" class="search-field" value="<?php echo get_search_query(); ?>" placeholder="サイト内検索 …" name="s" id="s" />
<input type="hidden" value="<?php echo get_post_type(); ?>" name="post_type" id="post_type" />
<input type="submit" class="search-submit" value="" />
</div>
</form>
search.php
検索結果を表示するためのsearch.phpをカスタマイズしていきます。
先程フォームに設定した投稿タイプを取得してループを回すといった流れですね。
$search_query = new WP_Query( array( 'post_type' => get_query_var( 'post_type', 'post' ), 'paged' => get_query_var( 'paged', 1 ), 's' => get_search_query() ) );
if ( $search_query->have_posts() ) {
while ( $search_query->have_posts() ) {
$search_query->the_post();
/* ループ内で表示させる処理 */
}
}
wp_reset_postdata();
get_query_var( 'post_type', 'post' )
で、searchform.phpにて設定された投稿タイプを取得しています。’post_type’が設定されていれば、そのカスタム投稿タイプ内のループを回し、設定されていなければ、通常の投稿のループを回すといった処理です。
おわり
WordPressのサイト内検索を投稿タイプごとに限定させる方法でした。
HTMLのフォームの仕組みと、WP_Query
の概念が分かっていれば、すぐに実装できると思います。投稿タイプが乱立している方は、ぜひお試しください!