LoginSignup
6
4

More than 3 years have passed since last update.

WordpressのDBから自作SQLを使ってアイキャッチ画像を取得した結果わかったこと

Last updated at Posted at 2019-12-18

1はじめに

Wordpressを勉強する人が最初にやることは、環境構築と管理画面の使い方だと思いますが!私はなんとデータベースから入りまして、管理画面⇒フォルダ構成と、なぜか逆走しながらWordpressを勉強中。今回は自作SQLを使ってアイキャッチ画像を取得したときのアハ体験をまとめました。

Wordpressのデータの全てはWP_POSTSが握っている!?

Wordpressの便利なところは、ネットで検索すればなんでも出てくるところ。それだけユーザが多く、みんな困ったことを共有しているからなのでしょう。
Wordpressのデータベース(以下、DB)は、全部で12テーブルしかないとてもシンプルなもの。こんなにいろいろ出来るのに、12テーブルしか持ってないことに驚きを隠せないのですが、本当すごいですね…。(※でもこの後、データベースの構造的には否定的な見解になってきたのでそれはまた後日。)
Wordpressの主となるデータは全てWP_POSTSにあると言ってもいいくらい、このテーブルはとっても重要なテーブルです。固定ページ・記事ページ・画像など、画面で見えるページのほとんどをこのテーブルで管理しています。

※参考:Wordpress Codex 日本語版(データベース構造)
http://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0

記事とアイキャッチ画像の紐づけはWP_POSTMETAで管理!

今回、記事に使われているアイキャッチ画像のURLを取得するためネットで調べていたのですが、どのサイトもPHPの処理ありきで書いてあるではありませんか。いやいや、私はSQL1本でとってきたいのです。だって、PHP分かんないんだもん(´;ω;`)
でも、どの方法を見てもWP_POSTMETAmeta_key="_thumnail"を条件に何かをみているではありませんか!(そういうのは分かる。笑)
どうやら、記事に使われているアイキャッチ画像の居場所を教えてくれているみたい…。ってか!数字しか書いてない!!どゆこと?と思ったら、どうやらその数字は、WP_POSTSのID情報だということが分かりました。(さすが!すべてを握っているテーブル!!)

アイキャッチ画像自体の情報はやっぱりWP_POSTSにある!

さっそくアイキャッチ画像のIDを指定して表示したところ、見事!WP_POSTSguidにアイキャッチ画像のURLが格納されていました。神!これで、記事に使われているアイキャッチ画像の保存先を特定することが出来ました。

アイキャッチ画像取得のために作成した鬼SQLがこちら↓↓↓

下記に記載するSQLは、アイキャッチ画像を取得するためだけのSQLではなく、「現在公開中の記事&ある特定のタグが付いている記事」という条件も追加しているSQLになっています。なので、途中ごちゃごちゃやっててすみません。
[xxxxx]のところは、限定したいタグのタグIDを記載するところなので、このまま実行しても動かないのでご注意ください。

select
    post_list.id,
    post_list.term_id,
    post_list.name,
    post_list.post_title,
    post_list.post_date,
    img_list.guid
from
    (select
         post.meta_id,
         post.id,
         tag.term_id,
         tag.name,
         post.post_title,
         post.post_date
     from
         (select
              wp_postmeta.meta_id,
              wp_posts.ID,
              wp_posts.post_title,
              wp_posts.post_date
          from
              wp_postmeta left join wp_posts on wp_postmeta.post_id = wp_posts.id
          where
              wp_postmeta.meta_key = '_thumbnail_id'
         ) as post left join (select
                                  wp_posts.id,
                                  wp_terms.term_id,
                                  wp_terms.name
                              from
                                  wp_posts left join wp_term_relationships on wp_posts.ID = wp_term_relationships.object_id
                                           left join wp_term_taxonomy on wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
                                           left join wp_terms on wp_term_taxonomy.term_id = wp_terms.term_id 
                              where
                                  wp_posts.post_status = 'publish' and
                                  wp_term_taxonomy.taxonomy = 'post_tag'
                             ) as tag on post.id = tag.id
    ) as post_list left join (select
                                  wp_postmeta.meta_id,
                                  wp_postmeta.meta_value,
                                  wp_posts.guid
                              from
                                  wp_postmeta left join wp_posts on wp_postmeta.meta_value = wp_posts.id 
                              where wp_postmeta.meta_key = '_thumbnail_id'
                             ) as img_list on post_list.meta_id = img_list.meta_id
where
post_list.term_id = '[xxxxx]' order by post_list.post_date DESC;

「長くて読む気にならん…汗」と近くに座っている人に言われたのですが(笑)、WP_POSTSが記事ページやら画像情報やらを全部レコード単位で保持しているのでややこしいだけで、実は結構考え方は簡単です。
上記SQLでは大きく分けて、post_listという私が勝手に名前を付けたSQL内のテーブルと、img_listというこれまた私が勝手に名前を付けたSQL内のテーブルが結合されています。それぞれのテーブルは、どちらもWP_POSTSから必要なデータを取得しています。つまり!WP_POSTSテーブル同士を結合させ、記事とアイキャッチ画像を紐づけているWP_POSTMETAで繋いでいる、そんなイメージで作成しました。(何言ってるか分からなかったらすみません…。)

WP_POSTSにあるpost_parentに騙されてはいけない!

はい、ここが今回のアハ体験によって声を大にして言いたいところです!!!
アイキャッチ画像のレコードを眺めていると、WP_POSTSpost_parentに設定されている記事のIDが記載されているではありませんか!おお!WP_POSTMETAで確認しなくても、ここで見ればええやん!って早とちりしてまんまとハマりました。
このpost_paretには、確かにアイキャッチ画像を設定した記事IDが入ることもあるのですが、100%アイキャッチ画像として設定されている記事IDがセットされているわけではないのです。

アイキャッチ画像の場合、WP_POSTSpost_parentの格納IDは管理画面の操作によって異なる

今となってはちょっとずつ理解できているのでなんとなく分かることも多いですが、これを調べていた時の私はWordpress Codexの各テーブルのフィールド解説を読んでもチンプンカン。親ってなんや!添付ファイルが所属する記事IDってなんや!何がどう違うんやっ!!!ってほぼほぼ半泣き。笑
アイキャッチ画像の登録をいろいろな方法で試してみた結果、post_parentに格納されるIDが3パターン存在することが分かりました。

パターン1:記事編集画面にあるところからアイキャッチ画像を新規登録
⇒この場合は記事IDが格納されます。

パターン2:メディアに新規登録したあと、記事編集画面からアイキャッチ画像を登録
⇒この場合は記事に依存しない画像という扱いになるので、一律ゼロが格納されます。

パターン3:他の記事で使用・登録された画像を作成中記事のアイキャッチ画像として使う
⇒この場合、流用元の記事IDが格納されます。

まとめ

WordpressはDBやプログラムが分からなくても簡単にWebサイトが作成出来るのが売りなのに、完全無視してDBを穴が開くほど見た結果、ちょっと楽しくなってきちゃいました。(今となっては前職の経験に感謝!笑)おそらく需要はないと思いますが、まだまだ同じようなアハ体験がけっこうあるので、ちょこちょこまとめて行きたいと思います。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4