WordPressの記事タイトルやカテゴリをSQLのleft joinで取得する

Last modified date

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で取得する方法だ!

魔王様

コメントを残す

メールアドレスが公開されることはありません。

Post comment