アドバンスカスタムフィールドで関連させた値をもっている記事を探す方法

Advanced Custom Fields(アドバンスカスタムフィールド)というWordPressのプラグインを利用して、カスタムポストタイプで設定した車種データを、投稿に関連付けさせています。

今回、$wpdbとselect文を使って目的の情報を取得することができましたので、その備忘録です。

目次

運営サイトにおけるカスタム投稿タイプとカスタムフィールドの利用状況

利用状況は下記のような感じ。

post(投稿) 車の体験談
model(カスタム投稿タイプ) 車種の情報
kuruma (カスタムフィールド) postとmodelをアドバンスカスタムフィールドプラグインで関連させたフィールド名(meta_key)を保存

アドバンスカスタムフィールドの設定は以下のようになっています。

アドバンスカスタムフィールド

投稿の編集画面では、車種の情報をmodel(カスタム投稿タイプ)で呼び出し関連付けさせます。

アドバンスカスタムフィールド

やりたかったのは任意の車種に関連しているpostのIDを取得すること

今回、やりたかったことは任意の車種に関連付けられているpostのIDを$wpdbを使って取得することでした。

そうすることで、たとえば車種「ウィッシュ」に関連付けられた記事の一覧を取得し表示することができます。

ちなみに、postmetaのテーブルには下記の様にpost_idが入っているので、postmetaテーブルからmeta_keyが’kuruma’で’meta_value’が’1664’を含むという両方の条件を満たすものを取得すればできそうです。

  object(stdClass)#260 (4) {
    ["meta_id"]=>
    string(4) "7481"
    ["post_id"]=>
    string(4) "1672"
    ["meta_key"]=>
    string(6) "kuruma"
    ["meta_value"]=>
    string(21) "a:1:{i:0;s:4:"1664";}"
  }

コード

以下のコードで取得することができました。

 
$meta_key = 'kuruma';
$meta_value = ****; // 値
 	
$results = $wpdb->get_results($wpdb->prepare("
 		select * from wp_postmeta 
 		where meta_value like '%%%s%%'
 		AND
 		meta_key = %s
 		", $meta_value, $meta_key));

結果を見てみると、実際に関連付けられている記事よりも多いので、後はstatusがpublic(公開)とされているものや、post_typeがpostになるものを選ぶ処理が必要になります。

つまづいたこと

カスタムフィールドの値はシリアライズされているのでここで悩みました。

likeを使えば良いということはわかったのですが、

1. 部分一致させるには、%sを%%%s%%にする
2. likeの後はシングルクォーテーションで囲む

この2点にたどり着くまで時間がかかりました。

参考にした記事
query – How to use wildcards in $wpdb queries using $wpdb->get_results & $wpdb->prepare? – WordPress Development Stack Exchange
WordPressでQueryをゴリゴリ操作 wpdbまとめ-ITかあさん

まとめ

今までwpdbやselect文はちょっとハードルが高いと思っていたのですが、これを使えると自分が取得したいデータに素早くアプローチできるのでかなり便利ですね。

これからは積極的にwpdbとselect文を使って経験値を上げていきたいとおもいます。