こんなケース
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から徐々に進めてきました。