ワードプレスで検索時に実行される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 ワードプレスのテーマや検索のカスタマイズ、コーディングのご依頼・ご相談はワードぷプレスドクターまでお気軽にお送りください
 

 
        



