Advanced Custom Fieldsで選択肢が複数のフィールドをWP_Queryで取り出す

Advanced Custom Fields を使って、カスタムフィールドを活用することが多いのですが、フィールドタイプに「関連」を使うと、ある投稿に関連する、別の投稿を登録することができます。

で、その値は、get_field()で取り出すことができます。

$page_id = 16534;
$relation_page_id_list = get_field($page_id , 'relation')
print_r(relation_page_id_list);

戻り値は、配列なので、
Array ( [0] => 12130 )
となります。

WP_Queryで関連元を取り出す

これはこれでOKなのですが、今度は逆に、関連とされた投稿から、関連元を取り出す必要がある場合。

WP_Queryでmeta_keyとmeta_valueに値を入れて取り出すことになるのですが、

$shop_id = 12130;
$args = array (
	'posts_per_page' => 5,
	'post_type' => 'post',
	'post_status' => 'publish',
	'meta_key' => 'relation',
	'meta_value' => $shop_id,
);
$query = new WP_Query($args);

これでは取り出せません。
そもそも、get_field()で取り出した値が配列な時点で、無理だろうなー、と思うのですが案の定ですね。

では、そもそも、「関連」フィールドで保存されたmeta_valueはどんな形なのかというと、

$page_id = 16534;
$table = $wpdb->prefix . "postmeta";
$shops_id = $wpdb->get_results( "SELECT post_id , meta_value FROM $table WHERE meta_key = 'shopspage' AND post_id = " . $page_id , ARRAY_A);
print_r ($shops_id);

と直接SELECTをたたいてみるとこんな感じで、meta_valueには、シリアライズされたデータで保存されてることがわかります。

Array ( [0] => Array ( [post_id] => 16534 [meta_value] => a:1:{i:0;s:5:”12130″;} ) )

なので、普通に、meta_valueで検索しても引っかかりません。
ではどうすればいいかというと、meta_valueそのものは文字列なので、LIKEで見つければいいのではと。

$shop_id = 12130;
$args = array (
	'posts_per_page' => 1,
	'post_type' => 'post',
	'post_status' => 'publish',
	'meta_key' => 'relation',
	'meta_value' => '"' . $shop_id . '"',
	'meta_compare' => 'LIKE',
);
$query = new WP_Query($args);

これで関連元のページ一覧を取得できます。

ちなみに、

‘”‘ . $shop_id . ‘”‘

と、わざわざダブルクォーテーションで囲っているのは、たとえば12130 は 121、1213、2130なんかでも引っかかってしまうからです。

nakaike