- 投稿日: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フィルターが掛かるので、ここに自作関数をねじ込むことで検索条件を操作出来るようです。
返す条件はそのままクエリになります。
これでやりたい放題ですね。
上記関数でしていることは以下のとおりです。
- 対象とする投稿タイプを設定(15〜23行目)
- カスタムフィールドなども検索対象にする(25〜39行目)