この記事は最後に更新してから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

お勧め

get_the_post_thumbnail_caption(2018年5月27日 更新)

string get_the_post_thumbnail_caption( mixed $post = null )
投稿ページのサムネイル(アイキャッチ画像)キャプションを取得する。

wp_enqueue_style(2019年11月25日 更新)

void wp_enqueue_style( string $handle [ , string $src = false [ , array $deps = array() [ , string $ver = false [ , string $media = 'all' ] ] ] ] )
使用するスタイルシート(CSS)を出力用のキューに入れる。パラメータ$srcが指定された場合は、グローバル変数$wp_stylesに登録してから出力用のキューに入れる。

post_class(2018年5月27日 更新)

void post_class( [ string $class = '' [ , int $post_id = null ] ] )
投稿情報の種別に応じたクラス属性(class="post-?? post ...")を表示する。具体的なクラス名は、投稿ID(post-番号)、投稿種別(postやpage)、カテゴリー(category-名前)、タグ(tag-名前)などがある。これらクラス名に合わせたCSSを準備することで、投稿ページのユニークなデザインが表現可能になる。

get_header(2020年8月18日 更新)

void | false get_header( [ string $name = null [ , array $args = array() ] ] )
ヘッダパーツを記述したメインヘッダファイルheader.php(またはサブヘッダファイルheader-???.php)を読み込む。

get_the_excerpt(2018年5月27日 更新)

string get_the_excerpt( [ mixed $post = null$deprecated = '' ] )
投稿情報の抜粋記事を取得する。