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