WordPressの投稿内容について
ある特定の条件を満たす投稿を絞り込んで、
エクスポートしたデータをエクセルで扱いたい。
まず管理画面のエクスポートから試してみたが、
詳細の絞り込みもできないし、何よりxml形式なので
エクセルで一覧として取り扱うにはちょっと無理がある。
という訳で管理画面のエクスポートはあきらめて
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タブから実行する。
結果はすべてのカラムではなく、
タイトル(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 )
さらに孫カテゴリーがある場合は、
サブクエリで深くすれば対応が可能だ。
この絞り込んだ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 ) ) ) ) )
同じくエクセル形式でエクスポートが可能だ。
以上です。
投稿前のデータをエクセルで管理していて、
数が合わない時などの消し込みをする際には
こういった事が便利な時もあるかと思う。