【WordPress】検索にカスタムフィールド の値を含める(search.php / function.php)
WordPressの標準機能、検索において、
カスタムフィールド の値を含めた検索をしたいと思います。
WordPressではTOPページのURLにパラメータ[?s=検索ワード]を含めると検索クエリが動きます。
この検索クエリは、通常のメインクエリとは異なり、
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->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)";
}
return $join;
}
add_filter( 'posts_join', 'join_custom_fields', 10, 2 );
カスタムフィールド は「postmeta」というテーブルに格納されていきますので、検索の時だけ、postmetaテーブルをつなげるようにします。(JOIN)
※テーブル名は「$wpdb->[テーブル名]」と書きます。
検索時にカスタムフィールドの値をも検索する
次に、検索時に受け取ったキーワードを、カスタムフィールドの中も検索できるようにします。
function custom_search($orig_search, $query) {
//管理画面とメインクエリではない時は実行しない
if( is_admin() || ! $query->is_main_query() ){
return;
}
//検索の時にだけ実行
if ( $query->is_search()) {
global $wpdb;
//指定したカスタムフィールドキーの中からあいまい検索します
$search =' AND ';
$search .="($wpdb->postmeta.meta_value LIKE '%".get_search_query()."%' and $wpdb->postmeta.meta_key = 'カスタムフィールドキー')";
return $search;
}
return $orig_search;
}
add_filter('posts_search','custom_search', 10, 2);
get_search_query()には検索キーワードが格納されています。
カスタムフィールドを指定して、検索キーワードをあいまい検索しています。
これで指定したカスタムフィールドの値も検索結果に含める事ができました。