ワードプレスで過去の記事を大量に削除

ワードプレスで過去の記事を大量に削除した方法について書き留めて置こうと思います。

実はあるサイトで日々のニュース関連の記事をほぼ毎日投稿していて、それが10年程も続けるとかなりの投稿数になっていました。
記事内容からして過去の記事は不要と思い、いっそ過去記事を削除してみようと思ったわけです。

ワードプレスから記事を削除したら問題があった

記事を削除するのは簡単です。ダッシュボードから記事一覧、投稿検索やカテゴリーで削除する記事を選択。

削除したい記事にチェックをいれ「ゴミ箱へ移動」すれば削除完了です。

ワードプレスの記事を削除

これを100記事、200記事と行ったのですが、ゴミ箱を空にすると問題が。

削除したカテゴリーの残りの記事を表示すると、アドレスバーにはそのカテゴリーのURLが表示されて、記事内容は空白なんですね。

他のカテゴリーの記事は全く問題なく表示されています。大量に削除したカテゴリーの記事だけが上手く表示されないという状態です。

プラグインに原因があるかと、サイトマップやリビジョン、サイトマップジェネレーター、キャップ系プラグインなど、関連しそうなプラグインを止めて行ってもダメでした。
記事をまとめて削除するプラグインもあるようですが、英語表記でわかりづらいこともあってやめました。

直接データベースにアクセルする

結局、直接データベースにアクセスして記事を削除することを選びました。

結論からいうと、これが大正解で、もっとも簡単でした。その手順とSQL文を紹介します。

まずは、UpDraftPlusなどでデータベースをバックアップしておきます。
そしてサーバーにログインして「データベース」の「phpMyAdmin」にログインします。

phpMyAdminにログイン

ログインしたら、上部にある「SQL」タブを選択

データベースの内容

①削除したい記事の確認

まずは、削除したい記事があるか、コードに間違いがないかチェックします。

SQL文を入れるテキストボックス①に以下のコードを入れて実行②をクリックします。

SELECT p.ID, p.post_title, p.post_date
FROM wp_posts p
JOIN wp_term_relationships tr ON p.ID = tr.object_id
WHERE tr.term_taxonomy_id = 33
AND p.post_type = 'post'
AND p.post_status = 'publish'
AND p.post_date < '2022-01-01'
AND p.post_title LIKE '%タイトルに含まれる文字%';
SQL文を実行

すると、指定した条件の記事の一覧が表示されます。これで削除対象の記事の確認とコードが間違っていないことの確認ができました。

データベースから抽出した記事一覧

本当に削除を実行

今度は本当に削除します。
同様に以下のコードを入力して実行します。

DELETE p
FROM wp_posts p
JOIN wp_term_relationships tr ON p.ID = tr.object_id
WHERE tr.term_taxonomy_id = 33
AND p.post_type = 'post'
AND p.post_status = 'publish'
AND p.post_date < '2022-01-01'
AND p.post_title LIKE '%タイトルに含まれる文字%';
記事を削除するSQL文

●●行削除しました」と表示され、指定した記事が削除されたのが確認できます。

SQL文実行で記事削除完了

たぶんここまでも良いと思うのですが、念のため次のコードも実行しておきます。

投稿メタを削除するコード

DELETE pm
FROM wp14_postmeta pm
JOIN wp14_posts p ON pm.post_id = p.ID
JOIN wp14_term_relationships tr ON p.ID = tr.object_id
WHERE tr.term_taxonomy_id = 33
AND p.post_type = 'post'
AND p.post_status = 'publish'
AND p.post_date < '2022-01-01'
AND p.post_title LIKE '%タイトルに含まれる文字%';

カテゴリ・タグの紐付けを削除するコード

DELETE tr
FROM wp14_term_relationships tr
JOIN wp14_posts p ON tr.object_id = p.ID
WHERE tr.term_taxonomy_id = 33
AND p.post_type = 'post'
AND p.post_status = 'publish'
AND p.post_date < '2022-01-01'
AND p.post_title LIKE '%タイトルに含まれる文字%';

今回はいずれも削除件数が0件でした。

クエリ実行結果

SQL文の解説

最後にSQL文を解説しておきます。

最初に削除するファイルの一覧を表示するコードで解説します。

SELECT p.ID, p.post_title, p.post_date
FROM wp_posts p
JOIN wp_term_relationships tr ON p.ID = tr.object_id
WHERE tr.term_taxonomy_id = △△
AND p.post_type = 'post'
AND p.post_status = 'publish'
AND p.post_date < '2022-01-01'
AND p.post_title LIKE '%■■%';

今回の記事の抽出条件としては

「カテゴリー」「投稿日」「タイトルに含まれる文字」 でフィルターをかけています。

  • カテゴリーは「カテゴリーID」の数値を入れます。
  • 投稿日は 2022年1月1日以前を指定しています
  • タイトルに含まれる文字は、■■ のところ。’%’で両サイドかこみます。

つまり、「カテゴリーが〇〇で、投稿日が2022年以前で、記事タイトルに■■の文字が含まれている」という記事をピックアップしています。削除を実行するコードやメタ情報を削除するコードなど、他のコードも同じです。


少しSQL文がわかる人なら、この方法が一番簡単です。
また、全くSQL文のコードがわからなくとも、GeminiなどのAIでコードを提案してもらうと良いです。