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文を使って経験値を上げていきたいとおもいます。


