なかちょんブログ

プログラミングとマイクラ好きな子育てパパのブログ

WordPressのAdvanced Custom fieldで関連付けたpostをget_postsで取得する方法

   

星野さんと西川さんの書かれた本に紹介されていたので、最近、Advanced Custom fieldを使い始めました

このAdvanced Custom fieldはそれまで自分がやりたかったけど能力的にできなかった「記事とカスタム投稿タイプを関連付ける」ことが超絶簡単にできたので、すごく感激しました。

やりたかったことを具体的に言うと、下のような感じ。

‘model’ : カスタム投稿タイプ。車の車種の情報がはいっている。
‘post’ : 記事。これに車種のカスタム投稿タイプを関連づけると、自動的に車種の情報が表示されるようにしたい(フィールドは’kuruma’を利用)

Advanced Custom fieldは、記事入力時に、この’model’で既に登録されているものを呼び出し関連付けをすることができるのです。これ、本当に素晴らしい!

で、こうなると、カスタム投稿タイプ ‘model’を表示させたときに、これに関連する’post’の一覧を表示したくなるわけじゃないですか!

ここではまった!

一般的に関連付けを使っていない場合、’kuruma’というフィールドが、”パレット”という’post’を集める場合は、meta_queryを使って下記のようにできます。


 $args = array(
        'post_type' => 'post',
        'meta_query' => array(
            array(
                'key' => 'kuruma',
                'value' => 'パレット',
                'compare' => '='
            )
        )
    );
    $results = get_posts($args);

でも、Advanced Custom fieldで関連付けをすると、meta_valueのところがシリアライズされているのでこれだと全くダメなんです。

で、いろいろ悩んだ結果、無事に解決できました!

本当はもっと簡単な方法があるかもしれないけど、誰か知ってたら教えて下さい!

とりあえず、私が解決した方法は下記のとおり、
(*カスタム投稿タイプ ’model’をsingle-model.phpで表示させて関連するpostを表示する方法)

1.meta_valueにはカスタム投稿タイプ ‘model’のIDが入っていますのでIDを取り出す

  $kuruma_ID = $post->ID

2.これは数字なので文字列に変換

 $kuruma_ID = strval($kuruma_ID);

3.2を配列にいれる

 $array_ID[0] = $kuruma_ID;

4.シリアライズする

 $array_ID = serialize($array_ID);

4.後はmeta_queryでOK

  $args = array(
        'post_type' => 'post',
        'meta_query' => array(
            array(
                'key' => 'kuruma',
                'value' => $array_ID,
                'compare' => '='
            )
        )
    );
    
    $my_query = get_posts($args);

いやぁ、このAdvanced Custom fieldすごいです。
有料アドオンもあるみたいだけど、これは本当に素晴らしいです!

 - WordPress