【WordPress】タームIDで絞って検索する(search.php / function.php)

WordPressの標準機能、検索において(search.php)、
カスタム投稿タイプのカテゴリ(タクソノミー)を絞って検索したいと思います。

カテゴリ内でキーワード検索をするイメージです。

【標準機能】カスタム投稿タイプ、カテゴリ、タクソノミー、タームで絞り込む

標準機能として、

  • カスタム投稿タイプ
  • カテゴリ
  • タクソノミー
  • ターム

これらはスラッグを利用して絞り込む事ができるようです。
(現在カスタム投稿タイプのみ確認中)

これらは<form>タグの中で値を指定しておく事で、絞り込まれます。

例えば、カスタム投稿タイプを絞り込みたい場合、

<form role="search" method="get" class="search-form" action="<?php echo esc_url(home_url('/')); ?>">
	<!-- これを追加 -->
	<input type="hidden" name="post_type" value="タスタム投稿タイプ名">
	<!-- /これを追加 -->
	<input type="search" class="search-field" name="s" value="<?php echo get_search_query(); ?>" />
	<input type="submit" value="検索する">
</form>
[name]にpost_type、にカスタム投稿タイプ名を入れます。hiddenで良いでしょう。
※カスタム投稿タイプ名は英語になるはず。

これで検索するとURLのパラメーターには、

TOPのURL?post_type=タスタム投稿タイプ名&s=検索キーワード

このようになります。

カテゴリ、タクソノミー、タームは試していませんが、
以下のパラメータの時、干渉をしているようなので、おそらくスラッグを指定する事でできるのではないか..という憶測です。

  • &cat=**
  • &タクソノミー名=**

何か独自でパラメーターで値を渡したい時は、[cat]や[タクソノミー名]はパラメータのキーとして利用しない方が良いです。

また、スラッグが日本語の場合も正しく機能しない可能性があります。

タームIDをパラメーターで渡して絞り込む

カスタム投稿タイプのカテゴリのタームのスラッグが日本語だったので、
今回はタームのIDをパラメーターでへ渡して、絞り込むようにしました。

一つ前の記事でもご紹介したように、

【WordPress】検索にカスタムフィールド の値を含める(search.php / function.php)

検索クエリではtax_queryやmeta_queryが使えません。

ですので今回も、SQLを追加していきたいと思います。

下準備

function join_custom_fields( $join, $query ) {

	//管理画面とメインクエリではない時は実行しない
	if( is_admin() || ! $query->is_main_query() ){
		return;
	}

	//検索の時にだけ実行
	if ( $query->is_search()) {
		global $wpdb;
		
		//タームと投稿を紐づけているデータベースをつなげます
		$join = "INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)";
	}
	return $join;
}
}
add_filter( 'posts_join', 'join_custom_fields', 10, 2 );

検索する時には、タームと投稿を紐づけているテーブルをつなげます。(JOIN)

検索時にタームIDで絞って検索する

function custom_search($orig_search, $query) {

	//管理画面とメインクエリではない時は実行しない
	if( is_admin() || ! $query->is_main_query() ){
		return;
	}


	//検索の時にだけ実行	
	if ( $query->is_search()) {
		global $wpdb;

		//エンティティに変換
		$term_id = htmlentities($_GET['my_term_id'], ENT_QUOTES, "utf-8");
		
		//タームIDを指定します
		$search .=' AND ';
		$search .="($wpdb->term_relationships.term_taxonomy_id = ".$term_id.")";

		return $search;
	}
	return $orig_search;
}
add_filter('posts_search','custom_search', 10, 2);

タームIDはformに仕込んでおいて、$_GET[‘my_term_id’]で取得しています。

<!--検索フォームにhiddenでい入れる、もしくはselectでもなんでも-->
<input type="hidden" name="my_term_id" value="タームID">

これで検索時に受け取ったタームIDで絞る事ができます。