Search Everything 使ってたんですが、ずっと更新されてないため昨年くらいから基本形として書いているコード。
案件によってはカスタムタクソノミーやらカスタム投稿タイプで絞りたいやらいろいろな要件は積み重なるんだけど、基本の形だけです。
下記コードを functions.php またはそれに準ずるところに記述します。
もくじ
コード本体
Gist版
まったく同じコードです。↓
function my_meta_search( $search, $wp_query ) {
if ( is_admin() || ! $wp_query->is_main_query() )
{
return $search;
}
if ( ! ( isset( $_REQUEST['s'] ) ) ) // 検索時のみ反応する
{
return $search;
}
// 条件
$cond_text = isset( $_REQUEST['s'] ) ? esc_attr( $_REQUEST['s'] ) : "";
if ( ! empty( $cond_text ) ) {
// カスタム投稿タイプで絞りたい場合
$_post_types = ['post', 'page', 'custom_post_type'];
global $wpdb;
// $search 初期化(しなくてもいいような気もするんですが、いろいろしがらみがある場合がある。)
$search = "";
$custom_post_types_in_sql = "'" . implode( "','", $_post_types ) . "'";
$search .= " AND post_type IN( {$custom_post_types_in_sql} )"; // カスタム投稿タイプで縛りたいとき
$cond_text = str_replace( " ", " ", $cond_text ); // 全→半変換
$search_words = explode( " ", $cond_text );
foreach ( $search_words as $word ) {
$word = trim( $word );
if ( ! empty( $word ) ) {
$search_word = esc_attr( $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;
}
add_filter( 'posts_search', 'my_meta_search', 10, 2 );
ほぼ、このままでは使っていないですwなんらかの絞り込みがあと何軸か入れるのが多いです。
条件自体も入力させることも多いです。
参考になれば幸いです。