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 を調整して蓄積自体を減らすのが効果的です。