WordPress 預設開啟文章修訂版和自動保存,導致數據庫膨脹、文章 ID 不連續、寫入性能下降。本文提供無需插件、不修改核心代碼、升級不失效的完美解決方案。
<?php
// wp-config.php 中,require_once ABSPATH . 'wp-settings.php'; 之前添加
// 1. 完全禁用修訂版
define('WP_POST_REVISIONS', false);
// 2. 或限制修訂版數量(保留最近 3 個)
// define('WP_POST_REVISIONS', 3);
// 3. 禁用自動保存(或修改間隔,單位:秒)
define('AUTOSAVE_INTERVAL', 86400); // 24小時 = 實際禁用
// define('AUTOSAVE_INTERVAL', 120); // 2分鐘
// 4. 強制禁用自動保存腳本(前端)
define('WP_DEBUG', false); // 生產環境關閉調試
?>
優勢:核心代碼最先讀取,優先級最高,主題/插件無法覆蓋,升級完全不受影響。
<?php
// functions.php
// 1. 移除修訂版保存動作
remove_action('pre_post_update', 'wp_save_post_revision');
// 2. 禁用自動保存腳本(前端不加載 autosave.js)
add_action('wp_print_scripts', 'disable_autosave_script');
function disable_autosave_script() {
wp_deregister_script('autosave');
}
// 3. 按文章類型禁用(如僅禁用 page 修訂版)
add_filter('wp_revisions_to_keep', 'custom_revisions_to_keep', 10, 2);
function custom_revisions_to_keep($num, $post) {
if ($post->post_type === 'page') return 0;
return $num; // 其他類型保持默認
}
// 4. 禁用 REST API 修訂版端點(WP 4.7+)
add_filter('wp_rest_post_types', function($post_types) {
unset($post_types['revision']);
return $post_types;
});
?>
<?php
// 1. 通過 WP-CLI(推薦,安全高效)
// wp post delete $(wp post list --post_type='revision' --format=ids)
// wp post delete $(wp post list --post_type='auto-draft' --format=ids)
// 2. 通過 phpMyAdmin / MySQL 客戶端(備份後執行)
// 刪除修訂版及其關聯數據
DELETE a, b, c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision';
// 刪除自動草稿
DELETE a, b, c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'auto-draft';
// 3. 重置文章 ID 連續性(慎用!會改變所有鏈接、破壞 SEO)
// 僅在全新站點、未被收錄時考慮
// ALTER TABLE wp_posts AUTO_INCREMENT = 1; // 不會重排現有 ID
// 真正重排需複雜腳本,強烈不建議生產環境操作
?>
上傳圖片/文件也會佔用 wp_posts ID。若極度追求 ID 連續:
add_filter('wp_insert_attachment_data', fn($data) => $data + ['ID' => null]);(實測不穩定,不推薦)。<?php
// 1. 新建文章,觀察 wp_posts 表
// post_type = 'post',無 revision 記錄
// 2. 編輯文章停留 2 分鐘,不觸發自動保存請求(Network 面板無 admin-ajax.php?action=autosave)
// 3. 數據庫查詢
SELECT post_type, COUNT(*) FROM wp_posts GROUP BY post_type;
// revision 和 auto-draft 應為 0 或極少
// 4. 前端檢查
// 頁面源碼無 autosave.js 載入
?>
| 誤區 | 後果 | 正確做法 |
|---|---|---|
| 修改 wp-admin/post.php 註釋 wp_enqueue_script('autosave') | 核心升級覆蓋,維護地獄 | 用 wp-config.php 常量或 functions.php 掛鉤 |
| 安裝「禁用修訂版」插件 | 插件衝突、額外開銷、棄維風險 | 幾行代碼解決,無需插件 |
| 定義 WP_POST_REVISIONS 後未生效 | 定義位置在 wp-settings.php 之後 | 務必放在 require_once ABSPATH . 'wp-settings.php'; 之前 |
| 刪除修訂版後 ID 仍不連續 | 自增 ID 本身不回收,媒體/頁面/菜單也佔用 ID | 接受 ID 不連續,無實際業務影響 |
WP_POST_REVISIONS = false、AUTOSAVE_INTERVAL = 86400(核心層面徹底禁用);remove_action('pre_post_update', 'wp_save_post_revision')、wp_deregister_script('autosave')(雙重保險);此方案零插件、零核心修改、升級無感、性能最優,適合所有 WordPress 站點。