この記事は最後に更新してから1年以上経過しています。
説明
ブロックエディターの登場により、標準のカスタムフィールドを使う機会はかなり減った気がする。そんな中、5.1.0で追加されたのが、カスタムフィールド名(メタキー)に含まれる文字列を指定する'meta_compare_key'キーだ。
1つのカスタムフィールドの値を検索
投稿情報の検索は、WP_Queryクラスや query_posts関数を使用する。カスタムフィールドの'profile_address'に'神奈川県'が含まれる投稿情報をWP_Queryクラスを使って取得する場合は、'meta_key'、'meta_value'、'meta_compare'の3つの値を指定する。
$query = new WP_Query(
array(
'meta_key' => 'profile_address',
'meta_value' => '神奈川県',
'meta_compare' => 'LIKE'
)
);
この連想配列で指定された内容は次に示すSQLの条件式になり、該当する投稿情報が検出される。
wp_postmeta.meta_key = 'profile_address' AND wp_postmeta.meta_value LIKE '%神奈川県%'
複数のカスタムフィールドの値を検索
5.1.0で追加された'meta_compare_key'キーは複数のカスタムフィールドに対して検索するためもものである。指定する値は'LIKE'かそれ以外('')。'LIKE'を指定した場合は、カスタムフィールド名が完全一致するものではなく、部分一致するものが対象となり、その値を評価することになる。例えば、カスタムフィールド名に'profile'が含まれ、その値に'神奈川県'が含まれる投稿情報を検索する場合は次のような指定となる。
$query = new WP_Query(
array(
'meta_key' => 'profile',
'meta_compare_key' => 'LIKE',
'meta_value' => '神奈川県',
'meta_compare' => 'LIKE'
)
);
実行時に生成されるSQLの条件式は次の通り。wp_postmeta.meta_keyの'='が'LIKE'に変更され、'meta_key'で指定された内容の前後に'%'が付いている。
wp_postmeta.meta_key LIKE '%profile%' AND wp_postmeta.meta_value LIKE '%神奈川県%'
実際に検索してみる
確認用のデータとして、投稿IDが1にカスタムフィールド名'profile_address'でその値が'神奈川県横浜市'を、投稿IDが20にカスタムフィールド名'profile_birthplace'でその値が'神奈川県'を追加したものを用意。さらにどのカスタムフィールドが条件にマッチしたのかを確認するため、WP_Queryオブジェクトを生成する前に次のフィルター処理を実行してみた。
function add_meta_fields( $fields ) {
global $wpdb;
return $fields . ", {$wpdb->postmeta}.meta_key, {$wpdb->postmeta}.meta_value";
}
add_filter( 'posts_fields', 'add_meta_fields' );
このフィルター処理は、検索で取得する投稿情報に条件にマッチしたカスタムフィールド名とその値を追加するもので、これで投稿情報からカスタムフィールドを取得する手間を省いている。
実際にWP_Queryオブジェクトに含まれる検索結果を確認する。
foreach ( $query->posts as $term ) {
var_dump( $term->ID, $term->meta_key, $term->meta_value );
}
この実行結果は次の通りで、2つの投稿情報が別のカスタムフィールドの値で検索できている。
int(20)
string(15) "profile_address"
string(21) "神奈川県横浜市"
int(1)
string(18) "profile_birthplace"
string(12) "神奈川県"
カスタムフィールド名は長めになってしまうが、数種類のカスタムフィールドに対して1回で検索できるメリットは大きい。同様の検索結果を得る方法として'meta_query'パラメータも利用でき、状況に応じて使い分けできる。
最終更新 : 2019年03月19日 10:42
お勧め
add_shortcode(2018年5月27日 更新)
get_user_setting(2022年1月31日 更新)
have_posts(2018年5月27日 更新)
in_category(2018年5月27日 更新)
add_feed(2024年6月24日 更新)