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