【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、[value]にカスタム投稿タイプ名を入れます。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で絞る事ができます。