【WordPress】サイト内検索にタグ/カテゴリー/カスタムフィールド を含める方法

当サイトのリンクには広告が含まれています。
目次

やりたいこと

WordPressのデフォルトの検索結果は、タイトルと本文しか検索対象ではないので、タグ、カテゴリー、カスタムフィールドの全ても検索結果に含めたい。

対応方法

検索条件を変更するため、function.phpに以下を記載する。

//サイト内検索のカスタマイズ
function custom_search($search, $wp_query) {
	global $wpdb;

	//検索ページ以外だったら終了
	if (!$wp_query->is_search)
	return $search;

	if (!isset($wp_query->query_vars))
	return $search;

	// タグ名・カテゴリ名・カスタムフィールド も検索対象にする
	$search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
	if ( count($search_words) > 0 ) {
		$search = '';
		foreach ( $search_words as $word ) {
			if ( !empty($word) ) {
				$search_word = $wpdb->escape("%{$word}%");
				$search .= " AND (
						{$wpdb->posts}.post_title LIKE '{$search_word}'
						OR {$wpdb->posts}.post_content LIKE '{$search_word}'
						OR {$wpdb->posts}.ID IN (
							SELECT distinct r.object_id
							FROM {$wpdb->term_relationships} AS r
							INNER JOIN {$wpdb->term_taxonomy} AS tt ON r.term_taxonomy_id = tt.term_taxonomy_id
							INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id
							WHERE t.name LIKE '{$search_word}'
						OR t.slug LIKE '{$search_word}'
						OR tt.description LIKE '{$search_word}'
						)
						OR {$wpdb->posts}.ID IN (
							SELECT distinct p.post_id
							FROM {$wpdb->postmeta} AS p
							WHERE p.meta_value LIKE '{$search_word}'
						)
				) ";
			}
		}
	}

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

タグ、カテゴリーに関する部分

以下のSQLがタグ名、カテゴリー名に一致したときを抽出する条件。
外したい場合は、この部分を消す。

OR {$wpdb->posts}.ID IN (
 SELECT distinct r.object_id
 FROM {$wpdb->term_relationships} AS r
 INNER JOIN {$wpdb->term_taxonomy} AS tt ON r.term_taxonomy_id = tt.term_taxonomy_id
 INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id
 WHERE t.name LIKE '{$search_word}'
 OR t.slug LIKE '{$search_word}'
 OR tt.description LIKE '{$search_word}'
)

カスタムフィールドに関する部分

以下のSQLがカスタムフィールド に含まれるキーワードに一致した時を抽出する条件。
外したい場合は、この部分を消す。

OR {$wpdb->posts}.ID IN (
 SELECT distinct p.post_id
	FROM {$wpdb->postmeta} AS p
 WHERE p.meta_value LIKE '{$search_word}'
)

SQLを駆使すれば、他の項目を含めるなど、色々検索条件を追加することも可能。

目次