WPの投稿をSQLで絞り込む

WordPressの投稿内容について
ある特定の条件を満たす投稿を絞り込んで、
エクスポートしたデータをエクセルで扱いたい。

まず管理画面のエクスポートから試してみたが、
詳細の絞り込みもできないし、何よりxml形式なので
エクセルで一覧として取り扱うにはちょっと無理がある。

WP管理画面のエクスポート

 

という訳で管理画面のエクスポートはあきらめて
phpMyAdminからSQLで絞り込んでエクスポートをする事にした。

・特定のキーワードを含む投稿を絞り込む
・特定のカテゴリーに属する投稿を絞り込む
上記2点についてメモを残す。

 

■特定のキーワードを含む投稿を絞り込む

DB上で投稿内容はwp_postsテーブルに入っている。

タイトルはpost_title、本文はpost_content、
投稿名はpost_nameのカラムにデータが入っている。

今回は投稿名(post_name)に「news」が含まれる投稿を絞り込んだ。

SELECT *
FROM wp_posts
WHERE (
  post_name LIKE '%news%'
)

 

上記のSQLをphpMyAdminのSQLタブから実行する。

phpMyAdminのSQLタブ

 

結果はすべてのカラムではなく、
タイトル(post_title)と本文(post_content)だけで良ければ下記のSQL。

SELECT post_title,post_content
FROM wp_posts
WHERE (
  post_name LIKE '%news%'
)

 

で次の画面で一番下のエクスポートをクリック。

エクスポートボタン

 

さらに次の画面でXLS Workbookを選択して実行すれば
エクセル形式でエクスポートが可能だ。

エクセル形式を選択

 

■特定のカテゴリーに属する投稿を絞り込む

カテゴリーに関連するテーブルは
wp_term_relationshipsとwp_term_taxonomyだ。

先程のwp_postsにはIDというカラムがあり、
そのIDがwp_term_relationshipsのobject_idと紐づいている。

 

あるひとつのカテゴリーIDに属する投稿を絞り込むのであれば
特に複雑ではない。

wp_term_relationshipsテーブルのterm_taxonomy_idカラムに
含まれるカテゴリーIDでobject_idを絞り込む。
そのobject_idをwp_postsのIDカラムで絞り込めばOKだ。

まずwp_term_relationshipsテーブルで絞り込む際のSQL。
ここでは絞り込むカテゴリーIDは103とする。

SELECT object_id
FROM wp_term_relationships
WHERE (
  term_taxonomy_id = 103
)

上記のSQLで絞り込んだobject_idを使ってwp_postsで絞り込む。
私はあまりSQLに詳しい訳ではないが、
下記のようにSELECTを入れ子にするのはサブクエリと呼ぶはず。

SELECT *
FROM wp_posts
WHERE  (
  ID IN (
    SELECT object_id
    FROM wp_term_relationships
    WHERE (
      term_taxonomy_id = 103
    )
  )
)

で、先程と同じようにエクセル形式で出力をすればOKだ。

 

問題は親子カテゴリーになっている投稿を
まとめて絞り込む場合だ。

親子情報についてはwp_term_relationshipsの先で
wp_term_taxonomyというテーブルに記録されている。

前述のwp_term_relationshipsテーブルのterm_taxonomy_idと
wp_term_taxonomyテーブルのterm_taxonomy_idが紐づいている訳だが、
例えば、あるカテゴリーの親カテゴリーIDが13だった場合には
wp_term_taxonomyテーブルにparentカラムがあり、
そこに13が入る事で親子関係を記録している。

例えば下記のような親子関係のカテゴリーがあったとする。

親カテゴリーID 子カテゴリーID
13 64
88
98

もちろん投稿をする際に親カテゴリーID(13)もチェックしていれば
絞り込みに苦労はないのだが、13をチェックしていない投稿もあるのであれば、
親子関係を調べたうえでそのカテゴリーIDに属する投稿を絞り込む必要がある。

まずはカテゴリーIDが13を親(parent)にもつ
term_taxonomy_idを絞り込む。

SELECT term_taxonomy_id
FROM wp_term_taxonomy
WHERE (
  parent = 13
)

子カテゴリー一覧

この結果のカテゴリーIDだけでも良いのだが、
親カテゴリーID(13)も含めたい場合は下記のSQL。

SELECT term_taxonomy_id
FROM wp_term_taxonomy
WHERE term_taxonomy_id = 13 OR (
  parent = 13
)

プラス親カテゴリーID

さらに孫カテゴリーがある場合は、
サブクエリで深くすれば対応が可能だ。

 

この絞り込んだterm_taxonomy_idに属するobject_idを
wp_term_relationshipsテーブルで絞り込む。

SELECT object_id
FROM wp_term_relationships
WHERE (
  term_taxonomy_id IN(
    SELECT term_taxonomy_id
    FROM wp_term_taxonomy
    WHERE term_taxonomy_id = 13 OR (
      parent = 13
    )
  )
)

この絞り込まれたobject_idをwp_postsテーブルで絞り込む。

SELECT *
FROM wp_posts
WHERE  (
  ID IN (
    SELECT object_id
    FROM wp_term_relationships
    WHERE (
      term_taxonomy_id IN(
        SELECT term_taxonomy_id
        FROM wp_term_taxonomy
        WHERE term_taxonomy_id = 13 OR (
          parent = 13
        )
      )
    )
  )
)

同じくエクセル形式でエクスポートが可能だ。

 

以上です。

 

投稿前のデータをエクセルで管理していて、
数が合わない時などの消し込みをする際には
こういった事が便利な時もあるかと思う。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です