WordPressの記事タイトルやカテゴリをSQLのleft joinで取得する
WordPressの記事データをSQL文で取得するには
様々なSQL文でデータを取得
select
wp_posts.ID,
wp_posts.post_title,
wp_term_relationships.term_taxonomy_id,
wp_term_taxonomy.term_id,
wp_term_taxonomy.taxonomy,
wp_terms.name
from
wp_posts
-- wp_postsのIDとwp_term_relationshipsのobjectidが同じものをjoin
left join wp_term_relationships on wp_posts.ID = wp_term_relationships.object_id
-- wp_term_relationshipsのterm_taxonomy_idとwp_term_taxsonomyのterm_taxonomy_idが同じものをjoin
left join wp_term_taxonomy on wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
-- wp_term_taxonomyのterm_idとwp_termsのterm_idが同じものをjoin
left join wp_terms on wp_term_taxonomy.term_id = wp_terms.term_id
where wp_term_relationships.object_id = 500195
limit 100
;
記事タイトルを取得
SQLで記事タイトルを取得したい場合は、wp_postsのpost_titleに格納されているのでそこから取得すればいいぞ。
例えば、公開した記事のタイトルを10記事取得する場合は以下のとおりである。
select
wp_posts.post_title
from wp_posts
where wp_posts.post_type = 'post'
and wp_posts.post_status = 'publish'
limit 10
;
記事のタクソノミーidを取得
記事に登録されているタクソノミーIDを取得したいときは、wp_term_relationshipsから取得する。
wp_term_relationshipsには「object_id」、「trem_taxonomy_id」、「term_order」が存在している。
object_idには記事ID、trem_taxonomy_idにはタクソノミーのIDが格納されているのだ。例えば、記事IDが500195のもつタクソノミーを取得したい場合は、次のようなクエリ文で取得できるのであるぞ。
select
trem_taxonomy_id
from wp_term_relationships
where wp_term_relationships.object_id = 500195
;
タームIDからタームタイトルを取得
カテゴリーの分類名やカスタムタクソノミーのターム名を取得したいなら、 wp_termsのnameに格納されている。
下の例だと、タームidが369のターム名を取得できるのである。
select
name
from wp_terms
where wp_terms.term_id=369
;
LEFT JOIN文で記事データをまとめて表示させる。
上で紹介したクエリはすべて1つのテーブルから項目を取得するものである。
同時に表示させるためには、複数のテーブルをつなげる必要がある。そのためにはJOINを使うがよい。
ここでは上で紹介した要素を一度に取得するクエリを紹介するぞ。
select
wp_posts.ID,
wp_posts.post_title,
wp_term_relationships.term_taxonomy_id,
wp_term_taxonomy.term_id,
wp_term_taxonomy.taxonomy,
wp_terms.name
from
wp_posts
-- wp_postsのIDとwp_term_relationshipsのobjectidが同じものをjoin
left join wp_term_relationships on wp_posts.ID = wp_term_relationships.object_id
-- wp_term_relationshipsのterm_taxonomy_idとwp_term_taxsonomyのterm_taxonomy_idが同じものをjoin
left join wp_term_taxonomy on wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
-- wp_term_taxonomyのterm_idとwp_termsのterm_idが同じものをjoin
left join wp_terms on wp_term_taxonomy.term_id = wp_terms.term_id
where wp_term_relationships.object_id = 500195
limit 100
;
JOIN文の書き方
JOIN文の書き方は
FROMにはベースとなるテーブル名。JOINには、つなげるテーブル名を指定して、ON以下で結合の条件を指定する。
ここで疑問に思うものもいるであろう。
今回2つのテーブルから取得するのだからFROMにベースとなるテーブルと、つなげるテーブル名を指定しなくていいのか?とな。
しかし、JOIN文の場合はJOINした最終的なテーブルをFROMで指定する。と考えるがよい。
select
wp_posts.ID,
wp_posts.post_title,
wp_term_relationships.term_taxonomy_id,
wp_term_taxonomy.term_id,
wp_term_taxonomy.taxonomy,
wp_terms.name
from
wp_posts
-- wp_postsのIDとwp_term_relationshipsのobjectidが同じものをjoin
left join wp_term_relationships on wp_posts.ID = wp_term_relationships.object_id
-- wp_term_relationshipsのterm_taxonomy_idとwp_term_taxsonomyのterm_taxonomy_idが同じものをjoin
left join wp_term_taxonomy on wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
-- wp_term_taxonomyのterm_idとwp_termsのterm_idが同じものをjoin
left join wp_terms on wp_term_taxonomy.term_id = wp_terms.term_id
where wp_term_relationships.object_id = 500195
limit 100
;
SELECT *
FROM ベースとなるテーブル名
JOIN つなげるテーブル名
ON 2つのテーブルの結合条件
LFET JOIN文で複数テーブルをつなぐ場合の注意点
whereのようにandは必要ない。
left join 追加テーブル① ON ○○(ベーステーブルの要素) = ●●(追加テーブル①の要素)
left join 追加テーブル② ON △△(ベーステーブルの要素)= ▲▲(追加テーブル②の要素)
...
のように続けて書いていけばよい。
ただし、順番には注意するのだ。
left joinは一度joinされたテーブルであれば2度目に使用することもできる。例えば
left join 追加テーブル① ON ○○(ベーステーブルの要素) = ●●(追加テーブル①の要素)
left join 追加テーブル② ON ●●(追加テーブル①の要素) = ▲▲(追加テーブル②の要素)
このように上ですでに連結されていれば、下のJOIN文で使用することが可能だ。
だが、これをコピーして順番を入れ替えると
left join 追加テーブル② ON ●●(追加テーブル①の要素) = ▲▲(追加テーブル②の要素)
left join 追加テーブル① ON ○○(ベーステーブルの要素) = ●●(追加テーブル①の要素)
この場合はエラーになる。
上のjoin文で追加テーブル①の要素と②の要素を連結しようとしているが、まだ①は連結されていないのでエラーになるのだ。
-- wp_postsのIDとwp_term_relationshipsのobjectidが同じものをjoin
left join wp_term_relationships on wp_posts.ID = wp_term_relationships.object_id
-- wp_term_relationshipsのterm_taxonomy_idとwp_term_taxonomyのterm_taxonomy_idが同じものをjoin
left join wp_term_taxonomy on wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
この2つを入れ替えるとエラーになる。
あとはつないで、必要な要素をSELECTすれば、記事情報を表示できるはずである。
例に出したクエリ文だと、公開した記事だけでなく、リビジョンなんかも拾ってきてしまうので、post_statusなんかで絞り込む必要があるがな!
いや、その場合はLEFT JOINでなく、INNER JOINでやればいいか。まぁそのへんは各々試してみるがよい!
以上がwordpressの記事情報をleft joinで取得する方法だ!