WordPressでカスタムフィールドも検索対象にする

WordPressでカスタムフィールドも検索対象に含めてみました。

といっても、全てのカスタムフィールドを検索対象にするといろいろとアレなので、特定の名前を持つもののみに限定しなければなりません。
そこは、

pm.meta_key IN ( 'meta_key1', 'meta_key2', 'meta_key3' )

の meta_keyn の部分を調整してもらえれば、大丈夫だと思います。

この記事は、jim912によって書かれたものです。
引用を行う場合は、著作権法に定める範囲にて、引用元であるSimple Colorsの出展元表示とhttp://www.warna.info/archives/2307/へのリンクを必ず行って下さい。

function search_custom_field_query( $search, $wp_query ) {
	if ( $wp_query->is_main_query() && $wp_query->is_search() && ! is_admin() ) {
		$q = $wp_query->query_vars;
		$n = !empty($q['exact']) ? '' : '%';

		$add_search = '';
		foreach( (array) $q['search_terms'] as $term ) {
			$term = esc_sql( like_escape( $term ) );
			$add_search = " OR ( pm.meta_key IN ( 'meta_key1', 'meta_key2', 'meta_key3' ) AND pm.meta_value LIKE '{$n}{$term}{$n}')";
		}
		$search = str_replace( ')))', ')' . $add_search . '))', $search );
	}
	return $search;
}
add_filter( 'posts_search', 'search_custom_field_query', 10, 2 );


function search_custom_field_join( $join, $wp_query ) {
	global $wpdb;
	if ( $wp_query->is_main_query() && $wp_query->is_search() && ! is_admin() ) {
		$join .= " INNER JOIN {$wpdb->postmeta} AS pm ON pm.post_id = {$wpdb->posts}.ID";
	}
	return $join;
}
add_filter( 'posts_join', 'search_custom_field_join', 10, 2 );

/*
 * 
 */
function search_custom_field_groupby( $groupby, $wp_query ) {
	global $wpdb;
	if ( $wp_query->is_main_query() && $wp_query->is_search() && ! is_admin() ) {
		$groupby = "{$wpdb->posts}.ID";
	}
	return $groupby;
}
add_filter( 'posts_groupby', 'search_custom_field_groupby', 10, 2 );

え?Search Everything 使えって?

カテゴリー: WordPressの小技 タグ: , , パーマリンク

WordPressでカスタムフィールドも検索対象にする への1件のフィードバック

  1. ピンバック: WordPressの検索フォームの精度を上げる | リンドウ制作日記

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です