• 投稿日:2022年02月15日 16時40分22秒
  • 更新日:2022年03月03日 09時32分10秒

custom_search($search, $wp_query)

                       
add_filter('posts_search','custom_search', 10, 2);
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 = '';
			
			$search_postType = "";

			// 対象にする投稿タイプを制御する
			foreach(Get_posts_types() as $type){
				if($type == "news" || $type == "page"){ // 固定ページとお知らせを対象にしない
					continue;
				}
				$search_postType .=  "'" . $type . "'";
			}
			$search_postType = str_replace("''", "','", $search_postType);
			$search .= "AND post_type in(" . $search_postType . ")";
			
			foreach ( $search_words as $word ) {
					if ( !empty($word) ) {
							$search_word = '%' . esc_sql( $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 post_id
								FROM {$wpdb->postmeta}
								WHERE meta_value LIKE '{$search_word}'
								)
							) ";
						
					}
			}
	}
	return $search;
}

説明

あちこちに似たようなものが上がっていたので、有名な関数のようですね。
get_postsにはposts_searchフィルターが掛かるので、ここに自作関数をねじ込むことで検索条件を操作出来るようです。

返す条件はそのままクエリになります。
これでやりたい放題ですね。

上記関数でしていることは以下のとおりです。

  1. 対象とする投稿タイプを設定(15〜23行目)
  2. カスタムフィールドなども検索対象にする(25〜39行目)

SPECIAL THANKS

  1. WordPressでカスタムフィールドの値をサイト内検索の対象にする方法(プラグインなし) -WeberNote-
  2. WordPressのサイト内検索の検索条件をカスタマイズする -WEBOPIXEL-
  3. wordpressのget_postsは検索結果ページでposts_searchフィルターが掛かる -株式会社ヴィンテージ-