2026年5月20日

2026年5月20日

WordPressのリビジョン数を制限する方法

はじめに

WordPressは記事を保存するたびに過去バージョン(リビジョン)を自動保存します。100記事を1年間書き続けると数千件のリビジョンがデータベースに蓄積され、クエリが遅くなる原因になります。リビジョン数を制限するだけでデータベースサイズを大幅に削減できます。

症状・原因

リビジョン関連の問題が発生する状況:

  • データベースが肥大化wp_postsテーブルが数百MBを超えている
  • 記事の取得が遅い:リビジョン込みでJOINクエリが重くなる
  • バックアップが大きい:不要なリビジョンデータがバックアップ容量を圧迫
  • 自動保存が多い:ブロックエディターの自動保存が頻繁にリビジョンを生成

デフォルトではリビジョン数に上限がなく、記事1件に100件以上のリビジョンが溜まることもあります。

解決手順

ステップ1:現在のリビジョン数を確認する

# WP-CLIでリビジョン数を確認
wp post list --post_type=revision --format=count

# 上位10記事のリビジョン数を確認
wp eval '
global $wpdb;
$results = $wpdb->get_results("
    SELECT p.post_parent, COUNT(*) as rev_count, pp.post_title
    FROM {$wpdb->posts} p
    LEFT JOIN {$wpdb->posts} pp ON p.post_parent = pp.ID
    WHERE p.post_type = \"revision\"
    GROUP BY p.post_parent
    ORDER BY rev_count DESC
    LIMIT 10
");
foreach ($results as $r) {
    echo $r->post_parent . ": " . $r->post_title . " (" . $r->rev_count . " revisions)\n";
}
'

ステップ2:wp-config.phpでリビジョン数を制限する

// wp-config.php に追加(DB_NAMEより前に追加)

// リビジョンを最新5件に制限(推奨)
define('WP_POST_REVISIONS', 5);

// リビジョンを完全に無効化
define('WP_POST_REVISIONS', false);

// 無制限(デフォルト)
define('WP_POST_REVISIONS', true);

WP_POST_REVISIONSは新規保存から反映されます。既存リビジョンを削除するには別途手順が必要です。

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

# WP-CLIで全リビジョンを削除
wp post delete $(wp post list --post_type=revision --format=ids) --force

# 削除前に件数を確認
wp post list --post_type=revision --format=count

SQLで直接削除する場合:

-- リビジョンとそのメタデータを削除
DELETE pm FROM wp_postmeta pm
INNER JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.post_type = 'revision';

DELETE FROM wp_posts WHERE post_type = 'revision';

-- テーブルを最適化
OPTIMIZE TABLE wp_posts, wp_postmeta;

ステップ4:投稿タイプごとに制限する

// functions.php — 特定の投稿タイプのみリビジョンを有効化
add_filter('wp_revisions_to_keep', function($num, $post) {
    if ($post->post_type === 'post') {
        return 5;  // ブログ記事は5件
    }
    if ($post->post_type === 'page') {
        return 3;  // 固定ページは3件
    }
    if ($post->post_type === 'product') {
        return 2;  // 商品ページは2件
    }
    return 0;  // その他は保存しない
}, 10, 2);

ステップ5:自動保存の間隔を調整する

// functions.php — 自動保存の間隔を延長(デフォルト60秒)
add_filter('heartbeat_settings', function($settings) {
    $settings['interval'] = 120;  // 120秒ごとに変更
    return $settings;
});

ステップ6:定期クリーンアップを設定する

// functions.php — 週次でリビジョンをクリーンアップ
add_action('wp', function() {
    if (!wp_next_scheduled('cleanup_old_revisions')) {
        wp_schedule_event(time(), 'weekly', 'cleanup_old_revisions');
    }
});

add_action('cleanup_old_revisions', function() {
    global $wpdb;
    
    // 各投稿で最新5件以外のリビジョンを削除
    $revisions = $wpdb->get_results("
        SELECT ID, post_parent
        FROM {$wpdb->posts}
        WHERE post_type = 'revision'
        ORDER BY post_parent, post_modified DESC
    ");
    
    $parent_count = [];
    $to_delete = [];
    
    foreach ($revisions as $rev) {
        $parent_count[$rev->post_parent] = ($parent_count[$rev->post_parent] ?? 0) + 1;
        if ($parent_count[$rev->post_parent] > 5) {
            $to_delete[] = $rev->ID;
        }
    }
    
    foreach ($to_delete as $id) {
        wp_delete_post_revision($id);
    }
});

注意事項

  • リビジョンを削除すると以前のバージョンに戻せなくなります。重要な記事は削除前にエクスポートしてください。
  • WP_POST_REVISIONS = falseは既存サイトのフロー確認後に設定することを推奨します。
  • 運用中のサイトで大量削除する場合は深夜の低トラフィック時間帯に実行しましょう。

まとめ

WP_POST_REVISIONSで新規リビジョン数を制限し、WP-CLIで既存リビジョンを削除することでデータベースを大幅に軽量化できます。制限値は記事タイプの重要度に合わせて調整するのがベストプラクティスです。関連記事:WordPressのデータベース最適化オプションテーブル最適化

お気軽にご相談ください

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