この記事は最後に更新してから1年以上経過しています。

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

お勧め

add_magic_quotes(2020年8月13日 更新)

array add_magic_quotes( array $array )
配列の文字列をスラッシュでクォートする。

image_downsize(2014年7月13日 更新)

mixed image_downsize( int $id [ , mixed $size = 'medium' ] )
アイキャッチ画像の縮小イメージ情報を取得する。

_e(2018年5月27日 更新)

void _e( string $text [ , string $domain = 'default' ] )
現在のロケールに応じた翻訳テキストを表示する。

wp_filter_oembed_iframe_title_attribute(2019年5月14日 更新)

string wp_filter_oembed_iframe_title_attribute( $result, $data, $url )
oEmbedのHTML(iframe要素のtitle属性値)に対してフィルター処理を行う。

wp_is_ini_value_changeable(2018年5月27日 更新)

bool wp_is_ini_value_changeable( string $setting )
PHPの設定値が変更可能か調べる。