2026年6月22日

2026年6月22日

WordPressのリビジョン数を制限する方法・wp_post_revisionsの設定

はじめに

「記事を何度も更新しているうちにデータベースが肥大化した」「リビジョンが何百件も溜まっている」——WordPressはデフォルトでリビジョンを無制限に保存します。上限を設定するだけでDBサイズを大幅に削減できます。

症状・原因

WordPressは投稿を保存するたびにリビジョン(変更履歴)をwp_postsテーブルにpost_type=revisionとして保存します。長期運用サイトでは数千〜数万件のリビジョンが蓄積し、DBの容量を圧迫してクエリ速度を低下させます。

解決手順

ステップ1:WP_POST_REVISIONSでリビジョン数を制限する

// wp-config.php: リビジョン数を制限する(推奨設定)

// 最大5件のリビジョンを保持
define( 'WP_POST_REVISIONS', 5 );

// リビジョンを完全に無効化(推奨しない — 復元できなくなる)
// define( 'WP_POST_REVISIONS', false );
// または
// define( 'WP_POST_REVISIONS', 0 );

// 推奨値の目安:
// - 個人ブログ: 3〜5件(更新頻度が低い場合)
// - ビジネスサイト: 5〜10件(誤操作の復元を考慮)
// - 大規模サイト: 3件(DBサイズを優先)

注意: WP_POST_REVISIONSを設定しても既存のリビジョンは削除されません。既存リビジョンは別途削除が必要です。

ステップ2:投稿タイプ別にリビジョン数を制御する

// functions.php: 投稿タイプ別に細かく制御
add_filter( 'wp_revisions_to_keep', function( $num, $post ) {

    switch ( $post->post_type ) {
        case 'post':   // 通常の投稿
            return 5;

        case 'page':   // 固定ページ
            return 10; // 重要なページは多めに保持

        case 'news':   // カスタム投稿タイプ(ニュース)
            return 3;

        case 'product': // WooCommerce商品
            return 3;

        case 'landing': // ランディングページ
            return 0;  // リビジョン不要

        default:
            return $num; // デフォルト値を使用
    }
}, 10, 2 );
// 特定の著者のリビジョンを制限
add_filter( 'wp_revisions_to_keep', function( $num, $post ) {
    // 投稿者ロールに応じてリビジョン数を変える
    $author = get_userdata( $post->post_author );
    if ( $author && in_array( 'contributor', $author->roles, true ) ) {
        return 2; // 寄稿者は2件のみ
    }
    return $num;
}, 10, 2 );

ステップ3:既存の余分なリビジョンを削除する

# WP-CLIで既存リビジョンを確認
wp post list --post_type=revision --format=count
# → 例: 2847 件

# 全リビジョンを削除(注意: 復元不可)
wp post delete --force \
    $(wp post list --post_type=revision --format=ids --posts_per_page=-1)

# 削除後に確認
wp post list --post_type=revision --format=count
# → 0 件
-- phpMyAdminで既存リビジョンを一括削除
-- バックアップ後に実行すること!

-- リビジョン数を確認
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision';

-- リビジョンに紐づくpostmetaも含めて削除
DELETE pm FROM wp_postmeta pm
INNER JOIN wp_posts p ON p.ID = pm.post_id
WHERE p.post_type = 'revision';

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

-- 削除後にテーブルを最適化
OPTIMIZE TABLE wp_posts;
OPTIMIZE TABLE wp_postmeta;

ステップ4:投稿ごとに古いリビジョンを自動削除する

// functions.php: 保存時に古いリビジョンを自動削除
add_action( 'save_post', function( $post_id ) {
    // 自動保存・リビジョン自体の保存時はスキップ
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    if ( wp_is_post_revision( $post_id ) ) return;

    $max_revisions = 5; // 保持するリビジョン数

    // この投稿のリビジョンを取得(新しい順)
    $revisions = wp_get_post_revisions( $post_id, [
        'order'          => 'DESC',
        'posts_per_page' => -1,
    ] );

    // 上限を超えた古いリビジョンを削除
    $count = 0;
    foreach ( $revisions as $revision ) {
        $count++;
        if ( $count > $max_revisions ) {
            wp_delete_post_revision( $revision->ID );
        }
    }
}, 20 );

ステップ5:リビジョン削除後のDB状態を確認する

# 削除前後でDBサイズを比較
wp db size

# wp_postsテーブルのサイズを確認
wp db query "
SELECT
    ROUND(data_length / 1024 / 1024, 2) AS 'データ(MB)',
    ROUND(data_free / 1024 / 1024, 2) AS '未使用(MB)'
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name = 'wp_posts';"

# テーブルを最適化(断片化を解消)
wp db optimize

# リビジョン一覧の確認
wp post list --post_type=revision --format=table --fields=ID,post_parent,post_modified
// 管理画面のダッシュボードにリビジョン統計を表示(デバッグ用)
add_action( 'wp_dashboard_setup', function() {
    wp_add_dashboard_widget(
        'revision_stats',
        'リビジョン統計',
        function() {
            global $wpdb;
            $count = $wpdb->get_var(
                "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'revision'"
            );
            $size = $wpdb->get_var(
                "SELECT ROUND(SUM(LENGTH(post_content)) / 1024 / 1024, 2)
                 FROM $wpdb->posts WHERE post_type = 'revision'"
            );
            echo "<p>リビジョン数: <strong>{$count}件</strong></p>";
            echo "<p>コンテンツサイズ: <strong>{$size}MB</strong></p>";
        }
    );
} );

注意事項

  • WP_POST_REVISIONSfalseまたは0にするとリビジョンが完全に無効化されます。誤って投稿を上書きした際に以前の版に戻せなくなるため、少なくとも3〜5件は保持することを推奨します。
  • 既存リビジョンを削除してからWP_POST_REVISIONSを設定してください。定数はあくまで新規保存時の上限を制御するもので、すでに保存済みのリビジョンには影響しません。
  • リビジョンを削除すると投稿の更新履歴が失われます。クライアント向けサイトでは誰がいつ変更したかの記録が必要な場合もあるため、完全削除の前にステークホルダーに確認してください。

まとめ

リビジョン制限は「wp-config.phpにWP_POST_REVISIONS=5を設定→wp_revisions_to_keepで投稿タイプ別に調整→WP-CLIで既存リビジョンを一括削除→OPTIMIZE TABLEで断片化解消」の流れで完了します。設定だけで既存リビジョンは削除されない点に注意してください。関連記事:WordPressの不要データを自動的に削除する方法WordPressのデータベースを最適化する方法

お気軽にご相談ください

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