2026年5月20日

2026年5月20日

WordPressのオートドラフト投稿を削除してDBを最適化する方法

はじめに

WordPressは記事を編集するたびにオートドラフト(自動保存)を作成します。これが蓄積するとデータベースが肥大化し、バックアップサイズの増加やクエリ速度の低下につながります。定期的なクリーンアップが重要です。

オートドラフトとは

auto-draft は、新規投稿作成時に自動的に作成される仮の下書きです。投稿を保存・公開すれば消えますが、途中でブラウザを閉じたり何もせずページを離れると孤立したauto-draftとして残ります。

削除手順

WP-CLIで削除(推奨)

# auto-draft の投稿を確認
wp post list --post_status=auto-draft --fields=ID,post_title,post_date

# auto-draft をすべて削除
wp post delete $(wp post list --post_status=auto-draft --format=ids) --force

# ゴミ箱の投稿も削除
wp post delete $(wp post list --post_status=trash --format=ids) --force

SQLで直接削除

-- auto-draft の投稿をすべて削除
DELETE FROM wp_posts WHERE post_status = 'auto-draft';

-- リビジョンも同時に削除
DELETE FROM wp_posts WHERE post_type = 'revision';

-- 孤立したpostmetaを削除
DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL;

-- DBを最適化
OPTIMIZE TABLE wp_posts, wp_postmeta;

WordPress関数で削除

// 管理画面からワンクリックで実行できるようにする
add_action('admin_init', function() {
    if (!isset($_GET['cleanup_auto_drafts'])) return;
    if (!current_user_can('manage_options')) return;

    $auto_drafts = get_posts([
        'post_status'    => 'auto-draft',
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ]);

    foreach ($auto_drafts as $id) {
        wp_delete_post($id, true);
    }

    wp_redirect(admin_url('?cleanup_done=1'));
    exit;
});

自動保存の間隔を調整する

// wp-config.php — 自動保存間隔を3分に延長
define('AUTOSAVE_INTERVAL', 180); // 秒(デフォルト60秒)

間隔を延ばすとauto-draftの生成頻度が下がりますが、ブラウザクラッシュ時の復元データが古くなるリスクがあります。

定期クリーンアップをスケジュール

// functions.php — 週次でauto-draftを自動削除
if (!wp_next_scheduled('cleanup_auto_drafts_event')) {
    wp_schedule_event(time(), 'weekly', 'cleanup_auto_drafts_event');
}

add_action('cleanup_auto_drafts_event', function() {
    $posts = get_posts([
        'post_status'    => ['auto-draft', 'trash'],
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'date_query'     => [['before' => '7 days ago']],
    ]);

    foreach ($posts as $id) {
        wp_delete_post($id, true);
    }
});

注意事項

  • wp_delete_post($id, true) の第2引数を true にしないとゴミ箱に移動するだけです
  • リビジョンの削除は WP_POST_REVISIONS=5 で保存数を制限する方がより根本的な対策です
  • OPTIMIZE TABLE はテーブルロックが発生するため、アクセスの少ない時間帯に実行してください
  • 削除前に必ずデータベースのバックアップを取ること

まとめ

オートドラフトのクリーンアップは wp post delete $(wp post list --post_status=auto-draft --format=ids) --force で即時実行できます。定期クリーンアップは wp_schedule_event で週次実行し、AUTOSAVE_INTERVAL を調整して蓄積自体を減らすのが効果的です。

お気軽にご相談ください

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