WordPress でカスタムフィールドとタームの列を加えた結果を返す SQL

  • MySQL
  • WordPress

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 = '{投稿タイプスラッグ}'
;

あとはコピペで他のフィールドやタームを追加できますが、あまりに面倒なので、おそらくもっと良い方法がある気がします。。