LoginSignup
1

More than 3 years have passed since last update.

Wordpressから特定の記事以外を全て削除

Last updated at Posted at 2020-04-12

はじめに

Wordpressで特定の記事以外を消したい時のTipsを載せておきます。
記事を2000件持っていて、その中で特定の100件だけ残して、他は全部消したい、みたいな場合を想定します。リライト記事だけ残すような場合に使えると思います。

実行環境 PHP:7.3 / MySQL:5.6 / Wordpress:5.4
※DBを変更する際は、元に戻せるように必ずDBやインスタンスのバックアップを取りましょう。

削除手順

不要記事の削除

  1. Workbenchなどのデータベース管理ツールをインストールし、DBへアクセス
  2. タイムアウト設定の変更
    MySQLWorkbench > Preference > SQLEditorから、
    DBMS connection keep-alive interval (in seconds)
    DBMS connection read timeout interval (in seconds)
    DBMS connection timeout interval (in seconds)
    をそれぞれ9999に変更して再起動します。デフォルト値ではタイムアウトしてしまうので・・・。

  3. 下記SQLを実行

DELETE FROM [DB].wp_posts
WHERE post_type = "post"
AND post_name != "777" AND post_parent != "777"
AND post_name != "1111" AND post_parent != "1111"
AND post_name != "1234" AND post_parent != "1234"
: (以下略。残したいIDを順に並べる)

通常の記事だけでなく、固定ページもこのwp_postsにありますので、残したい場合は忘れないように指定しましょう。
これだけでTOPからは消えて表示されなくなります。内部的には色々残っていますが、面倒な人はここで終わりで構いません。
私は不要パーツを最後まで削除しましたが、消したからといってページスピードが速くなるというわけでもありませんでした(速くなることを期待していたのですが・・・)。

不要になった記事パーツの削除

記事を削除してもカスタムフィールドやサムネイル等のパーツ、カテゴリ・タグの設定は残っています。
まずはカスタムフィールドやサムネイル等のパーツから削除します。

1.wp_postsのコピー

CREATE TABLE [DB].wp_posts_copy (SELECT * FROM [DB].wp_posts);

2.不要記事パーツの削除 (wp_posts)

DELETE FROM [DB].wp_posts
WHERE post_parent!=0 AND post_parent not in(SELECT ID FROM [DB].wp_posts_copy);

3.コピーしたテーブルの削除

DROP TABLE [DB].wp_posts_copy;

4.不要記事パーツの削除 (wp_postmeta)

DELETE FROM [DB].wp_postmeta
WHERE post_id NOT IN(SELECT ID FROM [DB].wp_posts);

1〜3で何故こんな面倒なことをしているかというと、MariaDBのバージョンが古いため、DELETE文の副問い合わせで同じテーブルを参照することができなかったためです。最新版では副問い合わせできるようなのでその場合はwp_postsをそのまま指定でOKです。

不要になったカテゴリ等の削除

続いて、カテゴリ・タグを削除します。

-- カテゴリ/タグと記事の紐付けの削除
DELETE FROM [DB].wp_term_relationships
WHERE object_id NOT IN (SELECT ID FROM [DB].wp_posts);

-- 記事との紐付けがなくなったカテゴリ/タグの削除
DELETE FROM [DB].wp_term_taxonomy
WHERE term_taxonomy_id NOT IN (SELECT term_taxonomy_id FROM [DB].wp_term_relationships);

-- 念の為,カウントが0(使用されていない)カテゴリ/タグの削除
DELETE FROM [DB].wp_term_taxonomy
WHERE count = 0;

-- カテゴリ/タグの設定の削除
DELETE FROM [DB].wp_terms
WHERE term_id NOT IN (SELECT term_id FROM [DB].wp_term_taxonomy);

こちらで削除完了です。
間違いがあればご指摘ください。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1