LoginSignup
10
14

More than 5 years have passed since last update.

WordPressの投稿データを、カテゴリー別に引っ張ってくるSQL

Posted at

こんなケース

WordPressの便利なところは、とりあえずブログ感覚で情報を発信できることや、プラグインなどを入れてカスタマイズしやすいところにあると思う反面、かゆい所に手が届くような機能を用意するのは以外と難しいような。

  • ニュースなど、頻繁に更新する部分はWordPressで公開
  • それ以外のページなどは直接HTMLやら生PHPとかで

なんていうケースも多いかなと思います。

WordPressの外だと直接SQLを投げる必要がある

以下、WordPressの投稿内容などがデータが入っているテーブルの接頭辞を "wpfoo_" とみなします。

 現時点で、公開中のデータを表示する

記事そのもののデータは、wpfoo_postsに記載されているので、
単純に公開中のデータから投稿した日時が新しい順に取得する場合、下記のようなSQLを投入します


SELECT id, post_author, post_title, post_content
FROM  `wpfoo_posts` 
WHERE post_status =  "publish"
ORDER  BY post_date DESC 

ところが、「特定のカテゴリに属する記事」かつ「記事のスラッグでカテゴリ分別は可能だが、カテゴリのIDがわからない」という制約条件が加わるので、少し話がややこしくなります

  • wp_posts タイトルや投稿本文などが存在する
  • wp_terms カテゴリ名とスラッグが保存されている
  • wp_term_relationships 投稿のIDとタクソノミーIDが関連付けられている
  • wp_term_taxonomy タクソノミーIDとカテゴリーIDが関連付けられている

ザッと、これだけのテーブルが絡んできます。
スラッグ名から投稿とカテゴリの関連付けにたどり着くまでが少しややこしいです。
そんな時は、問題点を細かく分解して少しずつ解いていきます

特定のスラッグを持つターム(カテゴリ、タグ)のIDを取得

まずは、スラッグ"hoge"を持つカテゴリのシリアルID(term_id)を取得するケースを想定します。


SELECT term_id
FROM wpfoo_terms
WHERE slug =  "hoge"

タームIDから、対応するタクソノミーIDを取得する

タームID は wp_termsテーブルに記載されているカテゴリなどを一意に分けるID。
タクソノミーIDは、wp_term_taxonomy テーブルに記載されている。また、一つのタームに複数のタクソノミーが存在することもある。

ちょっとややこしい話ですが


select term_taxonomy_id from  wp_newstest1_term_taxonomy
as tt inner join wp_newstest1_terms as ts term_taxonomy_id
on tt.term_id = ts.term_id 

特定のスラッグを持つカテゴリに属する投稿のうち、公開中のデータを新しい順に取得する場合

条件が多い分、投げるSQLも長くなります


SELECT id, post_author, post_title, post_content
FROM wpfoo_posts
WHERE post_status =  'publish'
AND id = (

SELECT object_id
FROM wpfoo_term_relationships
WHERE term_taxonomy_id = ( 
SELECT term_taxonomy_id
FROM wpfoo_term_taxonomy AS tt
INNER  JOIN wpfoo_terms AS tm ON tt.term_id = tm.term_id
WHERE tm.slug =  "hoge"  )
)
ORDER  BY post_date DESC 

サブクエリが入り組んでいて見苦しいですが・・・。
ここに至るまでに、最初のSQLから徐々に進めてきました。

10
14
1

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
10
14