phpMyAdminで特定の文字が入っているカスタムフィールドを抽出し、該当する複数の記事を一括で削除する

久々にWordpressの記事を。


カスタムフィールドはCustom Field Templateなどで拡張して、様々な入力を実現することができる。
今回はカスタムフィールド内に、ある特定の文言や数値等が入っている記事を一括で消したい。
という場合の方法を考えてみた。

前提として

SQLでカスタムフィールド内に特定の文字が含まれる列を検索して、見つかった記事のIDを抽出し、記事消す作業を行う。
なので、ジャンルというカスタムフィールドを作成し「metal」という入力がある記事を探す場合「death metal」も検索対象となるので注意。

方法

phpMyAdminにログインして該当するデータベースに移動する
カスタムフィールドの値が入ってる「wp_postmeta」テーブルを表示する

一覧が表示されるので、上部メニューの「検索」をクリックし、検索する。
今回は「う○こ」が含まれる列を検索。
(%%はワイルドカードと呼ばれるもの。詳しくはこちらを参照。)


う○こが含まれている列の一覧が表示されるので、エクスポート。
う○こをエクスポート。


フォーマットをMS Excel用のCSVにする


詳細にチェック


1行目にカラムを追加する。こうするとエクスポートしたCSVの1行目に「meta_id」「post_id」というカラムが付加される。


こうしてエクスポートしたCSVのpost_idが記事のIDとなる。
これを以下のSQLに反映させ、SQLを流すと、見事該当の記事を消す事が出来る。

DELETE FROM wp_postmeta WHERE  `post_id` IN(う○こが含まれる記事のpost_id) 

DELETE FROM wp_postmeta WHERE  `post_id` IN(1,2,3,4,5) 


ただこれだとpost_metaは削除できたが、記事の大元「wp_posts」は消せていない。
そこで以下。

DELETE FROM wp_posts WHERE  `ID` IN(う○こが含まれる記事のpost_id) 

追記

タクソノミーと記事を結びつけるテーブルも削除する必要がある。

DELETE FROM wp_term_relationships WHERE  `object_id` IN(1,2,3,4,5) 

これで該当する記事を削除する事ができる。

注意

  • データベースを触るので、必ず作業の前にバックアップを取る事。
  • 失敗したときに復旧できるように復旧方法を確立しておく事


Thom Yorke - The Eraser - YouTube