Advanced Custom Fields を使って、カスタムフィールドを活用することが多いのですが、フィールドタイプに「関連」を使うと、ある投稿に関連する、別の投稿を登録することができます。
で、その値は、get_field()で取り出すことができます。
1 2 3 |
$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に値を入れて取り出すことになるのですが、
1 2 3 4 5 6 7 8 9 |
$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はどんな形なのかというと、
1 2 3 4 |
$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で見つければいいのではと。
1 2 3 4 5 6 7 8 9 10 |
$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なんかでも引っかかってしまうからです。