WordPressのDBから投稿情報を一覧で抽出するSQLメモ

WordPressのデータベースから欲しい投稿情報を抽出した時のSQLのメモです。

WordPressを複雑には使っていないので、私の場合はこれでうまく抽出できました。
もし、コピペして使う場合は重複行が出たら手直しください。

※あくまで自分用のメモです。

欲しい項目(というか見たい一覧情報)

  • タイトル
  • スラッグ
  • 投稿日時
  • 更新日時
  • カテゴリー
  • タグ
  • タイトルの文字数
  • 記事の文字数※

※記事の文字数は、HTMLタグの文字数も含む数になってしまうので参考程度の情報

抽出条件

  • 投稿ステータスは、公開済み、下書き、予約投稿
  • 固定ページは除外

並び順

  • 投稿日時の古い順

SQL

SELECT a.ID
, a.post_title AS タイトル
, a.post_name AS スラッグ
, a.post_date AS 投稿日時
, a.post_modified AS 更新日時
, GROUP_CONCAT(b.name SEPARATOR ‘, ‘) AS カテゴリー
, GROUP_CONCAT(c.name SEPARATOR ‘, ‘) AS タグ
, CHAR_LENGTH(a.post_title) AS タイトルの文字数
, CHAR_LENGTH(a.post_content) AS 記事の文字数
FROM wp_posts a
LEFT JOIN (
SELECT sub_a.name
, sub_a.slug
, sub_c.object_id
FROM wp_terms sub_a
LEFT JOIN wp_term_taxonomy sub_b
ON sub_a.term_id = sub_b.term_id
LEFT JOIN wp_term_relationships sub_c
ON sub_b.term_taxonomy_id = sub_c.term_taxonomy_id
WHERE sub_b.taxonomy = ‘category’
) b
ON a.ID = b.object_id
LEFT JOIN (
SELECT sub_a.name
, sub_a.slug
, sub_c.object_id
FROM wp_terms sub_a
LEFT JOIN wp_term_taxonomy sub_b
ON sub_a.term_id = sub_b.term_id
LEFT JOIN wp_term_relationships sub_c
ON sub_b.term_taxonomy_id = sub_c.term_taxonomy_id
WHERE sub_b.taxonomy = ‘post_tag’
) c
ON a.ID = c.object_id
WHERE a.post_status IN (‘publish’, ‘future’, ‘draft’)
AND a.post_type = ‘post’
GROUP BY a.ID
ORDER BY a.post_date ASC;

アイキャッチ画像の情報も欲しい時(本当に参考レベル)

※注意 アイキャッチ画像を変更している場合、カテゴリー名とタグ名の項目が重複して取れてしまうようです。(GROUP BY すれば解消されるかも。試してないけど)

SELECT a.ID
, a.post_title AS タイトル
, a.post_name AS スラッグ
, a.post_date AS 投稿日時
, a.post_modified AS 更新日時
, GROUP_CONCAT(b.name SEPARATOR ‘, ‘) AS カテゴリー
, GROUP_CONCAT(c.name SEPARATOR ‘, ‘) AS タグ
, CHAR_LENGTH(a.post_title) AS タイトルの文字数
, CHAR_LENGTH(a.post_content) AS 記事の文字数
, d.post_title AS アイキャッチ画像のファイル名
, d.guid AS アイキャッチ画像の保存先パス名
FROM wp_posts a
LEFT JOIN (
SELECT sub_a.name
, sub_a.slug
, sub_c.object_id
FROM wp_terms sub_a
LEFT JOIN wp_term_taxonomy sub_b
ON sub_a.term_id = sub_b.term_id
LEFT JOIN wp_term_relationships sub_c
ON sub_b.term_taxonomy_id = sub_c.term_taxonomy_id
WHERE sub_b.taxonomy = ‘category’
) b
ON a.ID = b.object_id
LEFT JOIN (
SELECT sub_a.name
, sub_a.slug
, sub_c.object_id
FROM wp_terms sub_a
LEFT JOIN wp_term_taxonomy sub_b
ON sub_a.term_id = sub_b.term_id
LEFT JOIN wp_term_relationships sub_c
ON sub_b.term_taxonomy_id = sub_c.term_taxonomy_id
WHERE sub_b.taxonomy = ‘post_tag’
) c
ON a.ID = c.object_id
LEFT JOIN (
SELECT sub_a.post_title
, sub_a.guid
, sub_a.post_parent
FROM wp_posts sub_a
WHERE sub_a.post_type = ‘attachment’
) d
ON a.ID = d.post_parent
WHERE a.post_status IN (‘publish’, ‘future’, ‘draft’)
AND a.post_type = ‘post’
GROUP BY a.ID
ORDER BY a.post_date ASC;

あとがき

長めのSELECT文を書いたのは数年ぶりだったので、もっと上手い書き方はあるかもしれません。
(重複して取れちゃったらごめんなさい)