meta_compare_key使ってみた

説明

ブロックエディターの登場により、標準のカスタムフィールドを使う機会はかなり減った気がする。そんな中、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

お勧め

the_post(2018年5月27日 更新)

void the_post( )
投稿データをグローバル変数$postにロードし、関連するグローバル変数を設定する。

get_comments_number_text(2014年9月5日 更新)

string get_comments_number_text( [ mixed $zero = false [ , mixed $one = false [ , mixed $more = false ] ] ] )
コメント数を示す文字列を取得する。

sanitize_user(2019年4月24日 更新)

string sanitize_user( string $username [ , bool $strict = false ] )
文字列をユーザー名向けにサニタイズする。

is_object_in_taxonomy(2014年6月23日 更新)

bool is_object_in_taxonomy( string $object_type, string $taxonomy )
オブジェクトタイプがタクソノミーを使用できるか調べる。

wp_link_pages(2019年3月1日 更新)

string wp_link_pages( [ mixed $args = '' ] )
分割ページのリンクをパラメータ$argsのecho値が1ならば表示する。echo値が0ならばその文字列を取得する。