【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()には検索キーワードが格納されています。

カスタムフィールドを指定して、検索キーワードをあいまい検索しています。

これで指定したカスタムフィールドの値も検索結果に含める事ができました。