この記事は最後に更新してから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_shortcode(2018年5月27日 更新)

void add_shortcode( string $tag, mixed $func )
ショートコード(独自タグ)を追加する。ショートコードは、投稿記事内でテキスト内容がない[tag]や、テキストを内包する[tag]テキスト[/tag]の書式で使用できる独自タグのこと。標準の状態では、 the_content関数によって表示する直前のフィルター処理内でパラメータ$funcで指定した関数・メソッドが実行される。

get_user_setting(2022年1月31日 更新)

mixed get_user_setting( string $name [ , string $default = false ] )
ユーザーインターフェイス設定を取得する。

have_posts(2018年5月27日 更新)

bool have_posts( )
次の投稿データが存在するかを調べる。

in_category(2018年5月27日 更新)

bool in_category( mixed $category [ , mixed $post = null ] )
投稿情報が指定したカテゴリーに属しているか調べる。

add_feed(2024年6月24日 更新)

string add_feed( string $feedname, callable $callback )
フィードを追加する。