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_POSTMETA
のmeta_key="_thumnail"
を条件に何かをみているではありませんか!(そういうのは分かる。笑)
どうやら、記事に使われているアイキャッチ画像の居場所を教えてくれているみたい…。ってか!数字しか書いてない!!どゆこと?と思ったら、どうやらその数字は、WP_POSTS
のID情報だということが分かりました。(さすが!すべてを握っているテーブル!!)
アイキャッチ画像自体の情報はやっぱりWP_POSTS
にある!
さっそくアイキャッチ画像のIDを指定して表示したところ、見事!WP_POSTS
のguid
にアイキャッチ画像の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_POSTS
のpost_parent
に設定されている記事のIDが記載されているではありませんか!おお!WP_POSTMETA
で確認しなくても、ここで見ればええやん!って早とちりしてまんまとハマりました。
このpost_paret
には、確かにアイキャッチ画像を設定した記事IDが入ることもあるのですが、100%アイキャッチ画像として設定されている記事IDがセットされているわけではないのです。
アイキャッチ画像の場合、WP_POSTS
のpost_parent
の格納IDは管理画面の操作によって異なる
今となってはちょっとずつ理解できているのでなんとなく分かることも多いですが、これを調べていた時の私はWordpress Codexの各テーブルのフィールド解説を読んでもチンプンカン。親ってなんや!添付ファイルが所属する記事IDってなんや!何がどう違うんやっ!!!ってほぼほぼ半泣き。笑
アイキャッチ画像の登録をいろいろな方法で試してみた結果、post_parent
に格納されるIDが3パターン存在することが分かりました。
パターン1:記事編集画面にあるところからアイキャッチ画像を新規登録
⇒この場合は記事IDが格納されます。
パターン2:メディアに新規登録したあと、記事編集画面からアイキャッチ画像を登録
⇒この場合は記事に依存しない画像という扱いになるので、一律ゼロが格納されます。
パターン3:他の記事で使用・登録された画像を作成中記事のアイキャッチ画像として使う
⇒この場合、流用元の記事IDが格納されます。
まとめ
WordpressはDBやプログラムが分からなくても簡単にWebサイトが作成出来るのが売りなのに、完全無視してDBを穴が開くほど見た結果、ちょっと楽しくなってきちゃいました。(今となっては前職の経験に感謝!笑)おそらく需要はないと思いますが、まだまだ同じようなアハ体験がけっこうあるので、ちょこちょこまとめて行きたいと思います。