はじめに
Wordpressで特定の記事以外を消したい時のTipsを載せておきます。
記事を2000件持っていて、その中で特定の100件だけ残して、他は全部消したい、みたいな場合を想定します。リライト記事だけ残すような場合に使えると思います。
実行環境 PHP:7.3 / MySQL:5.6 / Wordpress:5.4
※DBを変更する際は、元に戻せるように必ずDBやインスタンスのバックアップを取りましょう。
削除手順
不要記事の削除
-
Workbenchなどのデータベース管理ツールをインストールし、DBへアクセス
-
タイムアウト設定の変更
MySQLWorkbench > Preference > SQLEditorから、
DBMS connection keep-alive interval (in seconds)
DBMS connection read timeout interval (in seconds)
DBMS connection timeout interval (in seconds)
をそれぞれ9999に変更して再起動します。デフォルト値ではタイムアウトしてしまうので・・・。 -
下記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);
こちらで削除完了です。
間違いがあればご指摘ください。