WordPress で wp_posts テーブルにはタイトル、コンテンツ、投稿時間などがありますが、カスタムフィールドなどのデータは含まれていません。それらの情報を連結し、一行で見る時の SQL です。
(SQL にそこまで詳しくないため、雑なので注意…)
wp_posts の結果を返す
まずは普通に wp_posts テーブルの結果を返します。p という仮の名前をつけました。これだけだと、投稿タイトルのみ表示されます。
SELECT
p.post_title
FROM
wp_posts AS p
;
カスタムフィールドの列を追加する
先ほどの結果に、カスタムフィールドの列「カラム名A」を追加してみます。サブクエリを使って、記事に紐づいているカスタムフィールドを取得します。
SELECT
p.post_title
(
SELECT
meta_value
FROM
wp_postmeta AS pm
WHERE
p.ID = pm.post_id
AND
pm.meta_key = '{フィールドのキー名}'
) AS {カラム名A}
FROM
wp_posts AS p
;
結果はこんな感じ。
post_title | カラム名A |
… | … |
… | …. |
… | … |
特定のタクソノミーのタームを、カンマ区切りで表示する列を追加する
タームの場合は、値が複数行になるのと、wp_term_relationships テーブルを挟んでいるため、少し複雑になります。ここでは、先ほどのクエリに {タクソノミー名} のタームをカンマ区切りの値として表示するようにしています。
SELECT
p.post_title AS name,
(
SELECT
meta_value
FROM
wp_postmeta AS pm
WHERE
p.ID = pm.post_id
AND
pm.meta_key = '{フィールドのキー名}'
) AS {カラム名A},
(
SELECT
GROUP_CONCAT(
DISTINCT name SEPARATOR ','
)
FROM
wp_terms
WHERE
term_id IN (
SELECT
r.term_taxonomy_id
FROM
wp_term_relationships AS r
WHERE
p.ID = r.object_id
)
AND
term_id IN (
SELECT
tt.term_id
FROM
wp_term_taxonomy AS tt
WHERE
tt.taxonomy = '{タクソノミー名}'
)
) AS {カラム名B},
FROM
wp_posts AS p
;
結果はこんな感じ
post_title | カラム名A | カラム名B |
… | … | ターム1,ターム2 |
… | …. | ターム3,ターム5, |
… | … | ターム1 |
投稿タイプを絞る
一番下に WHERE 句を書いておきましょう
...
FROM
wp_posts AS p
WHERE
p.post_type = '{投稿タイプスラッグ}'
;
あとはコピペで他のフィールドやタームを追加できますが、あまりに面倒なので、おそらくもっと良い方法がある気がします。。