ワードプレスで検索時に実行されるSQL文にpoat metaのテーブルをJOINする方法を解説いたします。

add_filter( ‘posts_join’ でpost meta(カスタムフィールドの値が入っています)をJOIN

add_filter( 'posts_join', 'posts_join_filter', 10, 2 );
function posts_join_filter( $join, $wp_query ) {
    global $wpdb;
    
    $join .= " LEFT JOIN $wpdb->postmeta AS postmeta_data ON ($wpdb->posts.ID = postmeta_data.post_id AND  "
                        . "( "
                                . "postmeta_data.meta_key = 'メタキー')"
                        . ") ";  

    return $join;
}

このコードは、ワードプレスがnew WP_Query や get_post関数でSQLが実行される際に、postmetaテーブルをpost IDを基準にして連結します。

LEFT JOIN ですのでPOSTにひとつづつ postmetaのデータが連結されます。

※メタキー の部分には連結したいカスタムフィールドのキーを入れます。

任意のメタキーを持つカスタムフィールドを検索に含める

カスタムフィールドを検索するには、メタクエリを使う方法があります。

$meta_query_args = array(
	'relation' => 'OR', // Optional, defaults to "AND"
	array(
		'key'     => '_my_custom_key',
		'value'   => 'Value I am looking for',
		'compare' => '='
	),
	array(
		'relation' => 'AND',
		array(
			'key'     => '_my_custom_key_2',
			'value'   => 'Value I am looking for 2',
			'compare' => '='
		),
		array(
			'key'     => '_my_custom_key_3',
			'value'   => 'Value I am looking for 3',
			'compare' => '='
		)
	)
);
$meta_query = new WP_Meta_Query( $meta_query_args );

今回は直接SQL文を書き換えて任意のメタキーを持つカスタムフィールドの値で投稿を検索してみます。

add_filter( 'posts_where', 'posts_where_filter', 10, 2 );
function posts_where_filter($search_term){
    $clause = '';
    global $wpdb;
    
    $search_term = trim(str_replace(" "," ",$search_term));
    
    if ( ! empty($search_term) ) {
        
        $clause .= ' AND (';
        
        $search_term_ar = explode(" ",$search_term);
        $or = "";
        
        foreach ($search_term_ar as $search_term_s){
            
            $search_term_s = trim($search_term_s);
            
            if(! empty($search_term_s)){
            
                $clause .= $or .'(postmeta_data.meta_key = "メタキー" AND postmeta_data.meta_value LIKE \'%' . esc_sql( $search_term_s ) . '%\')';
                
                $or = ' OR ';
            
            }
            
        }
        
        $clause .= ')';
    }		
    return $clause;    
}

add_filter( ‘posts_where’ はSQLのWHEREを書き換えるフィルタです。

$search_term_ar = explode(” “,$search_term); で 検索キーワードを空白文字で分解し、いずれかのキーワードをカスタムフィールドに含む場合に検索するようにしています。

先ほど連結したカスタムフィールドの定義キーpostmeta_data にLIKE \’%’ . esc_sql( $search_term_s ) . ‘%\’ でキーワードを含む場合を検索します。

上記コードでは、検索対象を任意のカスタムフィールドの値に限定し、空白文字でキーワードが指定された場合にはそのキーワードのいずれかがカスタムフィールドに含まれる投稿を検索します。

ご参考になりましたら幸いです。

WordPress ワードプレスのテーマや検索のカスタマイズ、コーディングのご依頼・ご相談はワードぷプレスドクターまでお気軽にお送りください