2026年8月30日

2026年8月30日

WordPressのリビジョンをデータベースから削除する方法|WP-CLI・SQL・上限設定

WordPressは、投稿や固定ページを更新するたびに、それまでの内容をリビジョンとして保存します。長く運用しているサイトでは、1つの記事に数十件のリビジョンが溜まり、wp_posts テーブルが大きくなります。この記事では、リビジョンの量を調べ、不要なものを削除し、今後増えすぎないように上限を設ける手順を説明します。内容は2026年10月時点のWordPress 6系とWP-CLI 2系を前提にしています。

リビジョンを削除すると、その時点の内容には戻せなくなります。作業の前にデータベースのバックアップを取ってください(wp db export など)。SQLの例はテーブル接頭辞が wp_ の場合です。

リビジョンの保存のされ方

リビジョンは、投稿と同じ wp_posts テーブルに、次のような形で保存されています。

列 値
post_type revision
post_status inherit
post_parent 元の投稿のID
post_name 通常のリビジョンは 123-revision-v1、自動保存は 123-autosave-v1 の形

自動保存(autosave)もリビジョンの一種ですが、投稿とユーザーの組み合わせごとに1件を上書きしていく仕組みなので、件数はあまり増えません。リビジョンには wp_postmeta のデータが付くこともあります(例: 脚注ブロックの内容)。

件数とサイズを調べる

# リビジョンの総数
wp post list --post_type=revision --format=count

# リビジョンの件数と本文の合計サイズ(MB)
wp db query "SELECT COUNT(*) AS cnt,
  ROUND(SUM(LENGTH(post_content)) / 1024 / 1024, 2) AS content_mb
FROM wp_posts WHERE post_type = 'revision';"

# リビジョンが多い投稿の上位20件
wp db query "SELECT post_parent, COUNT(*) AS revisions
FROM wp_posts WHERE post_type = 'revision'
GROUP BY post_parent ORDER BY revisions DESC LIMIT 20;"

上位の投稿のタイトルは wp post get 投稿ID --field=post_title で確認できます。

WP-CLIですべて削除する

WP-CLIの wp post delete は、WordPressの削除処理を通すため、リビジョンに付いたメタデータも一緒に削除されます。リビジョンはゴミ箱を経由せず、直接削除されます。

# すべてのリビジョンを削除する
wp post delete $(wp post list --post_type=revision --format=ids) --force

リビジョンが数万件あると、IDの一覧が長すぎてコマンドが失敗することがあります。その場合は500件ずつ削除します。

# 500件ずつ、なくなるまで削除する
while true; do
  IDS=$(wp post list --post_type=revision --format=ids --posts_per_page=500)
  [ -z "$IDS" ] && break
  wp post delete $IDS --force --quiet
done
wp post list --post_type=revision --format=count

特定の投稿のリビジョンだけを削除する場合は、--post_parent で絞り込みます。

# 投稿ID 123 のリビジョンだけを削除する
wp post delete $(wp post list --post_type=revision --post_parent=123 --format=ids) --force

各投稿の最新数件だけを残す

すべてを消すのではなく、各投稿の最新の数件を残したい場合は、次のスクリプトを wp eval-file で実行します。WordPressの関数を使って削除するため、メタデータも一緒に削除されます。

<?php
// trim-revisions.php
// 使い方: wp eval-file trim-revisions.php 3        (各投稿の最新3件を残す)
//         wp eval-file trim-revisions.php 3 dry    (削除せず件数だけ表示する)

$keep    = isset( $args[0] ) ? max( 0, (int) $args[0] ) : 3;
$dry_run = isset( $args[1] ) && 'dry' === $args[1];

global $wpdb;

// リビジョンを持つ投稿のIDを集める
$parent_ids = $wpdb->get_col(
	"SELECT DISTINCT post_parent FROM {$wpdb->posts} WHERE post_type = 'revision'"
);

$total = 0;
foreach ( $parent_ids as $parent_id ) {
	// 新しい順に取得する。check_enabled を false にすると、リビジョン無効の投稿タイプも対象になる
	$revisions = wp_get_post_revisions(
		(int) $parent_id,
		array( 'check_enabled' => false )
	);

	// 自動保存は対象から外す
	$revisions = array_filter(
		$revisions,
		function ( $revision ) {
			return ! wp_is_post_autosave( $revision );
		}
	);

	// 新しいものから $keep 件を残し、それより古いものを削除する
	foreach ( array_slice( $revisions, $keep ) as $revision ) {
		if ( ! $dry_run ) {
			wp_delete_post_revision( $revision->ID );
		}
		$total++;
	}
}

WP_CLI::success( ( $dry_run ? 'Would delete ' : 'Deleted ' ) . $total . ' revisions.' );

まず dry を付けて削除される件数を確認し、問題がなければ dry を外して実行します。

wp eval-file trim-revisions.php 3 dry
wp eval-file trim-revisions.php 3

SQLで削除する

WP-CLIが使えず、phpMyAdminなどからSQLで削除する場合は、リビジョンに付いたメタデータを先に削除してから、リビジョン本体を削除します。順番を逆にすると、どのメタデータがリビジョンのものだったか分からなくなります。

-- 1. リビジョンに付いたメタデータを削除する
DELETE pm FROM wp_postmeta pm
INNER JOIN wp_posts p ON p.ID = pm.post_id
WHERE p.post_type = 'revision';

-- 2. リビジョン本体を削除する
DELETE FROM wp_posts WHERE post_type = 'revision';

古いリビジョンだけを消したい場合は、2つの文の WHERE に同じ条件(例: AND p.post_date < '2026-01-01' と AND post_date < '2026-01-01')を加えます。各投稿の最新数件を残すような条件はSQLだけでは書きにくいため、前の節のスクリプトを使ってください。

SQLで削除した後は、WordPressのオブジェクトキャッシュに古い情報が残っていることがあるため、wp cache flush を実行するか、キャッシュ系のプラグインでキャッシュを削除します。

今後増えすぎないように上限を設ける

wp-config.php の /* That's all, stop editing! */ より前に、残すリビジョンの数を書きます。

<?php
// wp-config.php:投稿ごとに残すリビジョンを最新5件までにする
define( 'WP_POST_REVISIONS', 5 );
値 動作
true または -1(既定) 上限なし
正の整数 投稿ごとに最新のその件数だけを残す
false または 0 リビジョンを作らない

上限を超えた古いリビジョンは、その投稿を次に保存したときに削除されます。設定しただけでは、すでにあるリビジョンは消えないため、上の手順で一度整理します。false にすると、誤って上書きしたときに戻せなくなるため、数件は残すことをおすすめします。

投稿タイプごとに変えたい場合は、wp_revisions_to_keep フィルターを使います。このフィルターは WP_POST_REVISIONS より優先されます。

<?php
// 投稿タイプごとに残すリビジョン数を変える(PHP 8.0 以上)
add_filter( 'wp_revisions_to_keep', function ( $num, $post ) {
	return match ( $post->post_type ) {
		'post'  => 5,
		'page'  => 10,
		default => $num,
	};
}, 10, 2 );

自動保存の間隔(AUTOSAVE_INTERVAL、既定60秒)を延ばしても、リビジョンの件数はほとんど減りません。前述のとおり自動保存は1件を上書きする仕組みのためで、間隔を延ばすとブラウザーが落ちたときに失われる内容が増えるだけです。

削除後にテーブルを最適化する

大量の行を削除しても、テーブルのファイルの大きさはすぐには小さくなりません。最適化すると、使われていない領域が整理されます。

# 最適化の前後でテーブルの大きさを確認する
wp db size --tables

# wp_posts と wp_postmeta を最適化する
wp db query "OPTIMIZE TABLE wp_posts, wp_postmeta;"

InnoDBではテーブルの作り直しになり、大きなテーブルでは時間がかかり負荷も上がります。アクセスの少ない時間帯に実行してください。データベース全体を最適化する場合は wp db optimize も使えます。

まとめ

  • リビジョンは wp_posts に post_type = 'revision' で保存され、メタデータが付くこともある
  • 削除の前にバックアップを取り、wp post list --post_type=revision --format=count で件数を確認する
  • WP-CLIの wp post delete ならメタデータも一緒に消える。数万件ある場合は500件ずつ削除する
  • 各投稿の最新数件を残すなら、wp_get_post_revisions() と wp_delete_post_revision() を使うスクリプトを wp eval-file で実行する
  • SQLで消す場合は、メタデータを先に削除してから本体を削除する
  • WP_POST_REVISIONS か wp_revisions_to_keep で上限を設ける。AUTOSAVE_INTERVAL の変更は件数対策にならない

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲