WordPressのサイト内検索を投稿タイプごとに限定させる方法

カスタム投稿タイプを作るのは、役割を明確に区別したいからです。しかし、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();

参考:関数リファレンス/WP Query

get_query_var( 'post_type', 'post' )で、searchform.phpにて設定された投稿タイプを取得しています。’post_type’が設定されていれば、そのカスタム投稿タイプ内のループを回し、設定されていなければ、通常の投稿のループを回すといった処理です。

おわり

WordPressのサイト内検索を投稿タイプごとに限定させる方法でした。

HTMLのフォームの仕組みと、WP_Queryの概念が分かっていれば、すぐに実装できると思います。投稿タイプが乱立している方は、ぜひお試しください!

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

WordPressが得意なWeb屋。HPcode代表。

300件以上のWordPressカスタマイズを対応してきました。SE → 農家 → アフィリエイター → Web屋。生まれは三重県。