WordPress禁止版本修訂歷史、自動保存和自動草稿最新方法匯總


提醒:我這里匯總的方法有一些只支持以前老版本的WordPress,對於新版本的WordPress,有些功能是不支持的,所以操作前請做好備份。我的WordPress版本目前是4.3.1,我會在我測試有效的后面注明。

WordPress的版本修訂歷史(revision)、自動保存(autosave)和自動草稿(auto-draft)功能會非常討厭的增加文章ID的數字,會造成連續的兩篇文章,ID數值可能會相差很多,讓我們這些希望文章ID連續的人感到非常不舒服。

網上有很多的教程,但是有的說的不全面,有的說的有問題,我在這里做一個更正匯總。

禁用版本修訂歷史(revision)和自動保存(autosave):
版本修訂歷史(revision)是在文章發布后,每次更新時向數據庫添加一條版本修訂歷史記錄。這種方式和wiki很像。然而,由於個人博客很少需要保 留版本記錄,這個功能顯得有些雞肋。不知為何WordPress不給這樣的功能開一個設置選項,可以讓用戶選擇是否開啟。
自動保存(autosave)雖然應該存在,但WordPress的處理方式實在有些奇怪,自動保存居然也要占用文章ID,並且默認60s保存一次,這樣會造成一篇文章寫下來可能會消耗幾十個ID,並且在數據庫中存入了大量的無用信息。
不過,禁用之后也帶來了一個副作用:預覽不能使用了,需要手動保存草稿后才行。美中不足吧。

方法一:(未測試)
找到wp-includes/defaut-contants.php文件,修改如下代碼:

1
2
3
4
5
6
7
8
9
10
11
// 修改前
if ( !defined( 'AUTOSAVE_INTERVAL' ) )
   define( 'AUTOSAVE_INTERVAL' , 60 ); //這個是自動保存
if ( !defined( 'WP_POST_REVISIONS' ) )
   define( 'WP_POST_REVISIONS' , true ); //這個是版本修訂歷史
  
// 修改后
if ( !defined( 'AUTOSAVE_INTERVAL' ) )
   define( 'AUTOSAVE_INTERVAL' , false ); //禁用自動保存
if ( !defined( 'WP_POST_REVISIONS' ) )
   define( 'WP_POST_REVISIONS' , false ); //禁用版本修訂歷史

其中autosave的60為自動保存時間間隔,單位為s,可以修改為更大的數值或修改為false禁用。

這個方法要修改WordPress的原文件,對於主題制作者,如果要添加移除自動保存和修訂版本的選項,還是推薦下面的主題functions.php修改方法。

方法二:(測試有效)
上面這一步也可以修改根目錄下的wp-config.php文件,在“define(‘WP_DEBUG’, false);”后邊添加如下代碼:

1
2
3
4
define( 'WP_DEBUG' , false);
/** Disable autosave and revision */
define( 'AUTOSAVE_INTERVAL' , false );
define( 'WP_POST_REVISIONS' , false );


但是版本修訂歷史最好不要禁用而設置成10小時自動保存一次,即define(‘WP_POST_REVISIONS’, 36000 );,因為修改成false以后造成WordPress報錯的一個bug,開啟debug可以在編輯文章時看到提醒,編輯一篇文章可不會超過10小時,所 以效果是一樣的。
但是,這樣並沒有完全禁用掉自動保存。還需要修改wp-admin/post-new.php和wp-admin/post.php這兩個文件(老版本的 WordPress可能有四個文件“post.php,page.php,post-new.php,page-new.php”,方法還是一樣的)。將 這兩個文件中的wp_enqueue_script( ‘autosave’ );注釋掉,其中post.php還要把前面一行的if語句注釋掉,這個是新版本WordPress要注意的,老版本就網上就沒說注釋掉前面的if,如果不注釋掉發布新文章的時候會出錯,這一點也是在很多文章中沒有提到的。

方法三:(未測試)
在functions.php的最后php結束標記前加上如下代碼:

1
2
3
4
//移除自動保存
wp_deregister_script( 'autosave' );
//移除修訂版本
remove_action( 'post_updated' , 'wp_save_post_revision' );

這 里移除修訂版本的方法不同於網上早期的方法的地方是,’wp_save_post_revision’ 掛載的鈎子已經由‘pre_post_updated’變成了‘post_updated’,這個變化貌似是WordPress版本4.0之后,造成了早 期的修改方法失效了,具體見WordPress原文件wp-includes/default-filters.php第265行 (WordPress4.2.2版本)

禁用自動草稿(auto-draft):
自動草稿(auto-draft)是在WordPress3.0之后新增的功能,在點開新建文章后(不確定是否只是這種情況)自動保存的草稿,會被WordPress定期清除,但占據的ID也隨之失去。這個功能也沒有太大的用處,屬於雞肋功能。

方法一:(測試出錯)
禁用自動草稿,可以在wp-admin/includes/post.php中修改代碼如下:

1
2
3
4
5
6
7
// 修改前
if ( $create_in_db ) {
   $post_id = wp_insert_post( array ( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type , 'post_status' => 'auto-draft' ) );
   $post = get_post( $post_id );
   if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post ->post_type, 'post-formats' ) && get_option( 'default_post_format' ) )
     set_post_format( $post , get_option( 'default_post_format' ) );
}

簡 單解釋下這段代碼,先是清除七天以前的自動草稿,然后插入一條新草稿,如果你繼續寫文章並發布,那么這條草稿就被使用了,包括在后台首頁有一個快速發布, 也用到了這個。而很詭異的是,如果你后台點了“添加文章”,沒有輸入任何內容或到別的頁面或是關閉了,此時仍然會生成一個自動草稿,而這個草稿,是后台不 可見的,是垃圾數據,隱形的禍害,也是造成文章ID不連續的隱形殺手,之后我會專門介紹清理WordPress垃圾數據和完美解決文章ID不連續問題的辦 法。
言歸正傳,我們直接將上面代碼替換成

1
2
3
4
5
6
7
8
9
10
11
// 修改后
if ( $create_in_db ) {
   global $current_user ;
   $post = $wpdb ->get_row( "SELECT * FROM $wpdb->posts WHERE post_status = 'auto-draft' AND post_type = '$post_type' AND post_author = $current_user->ID ORDER BY ID ASC LIMIT 1" );
   if ( ! $post ) {
     $post_id = wp_insert_post( array ( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type , 'post_status' => 'auto-draft' ) );
     $post = get_post( $post_id );
   }
   if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post ->post_type, 'post-formats' ) && get_option( 'default_post_format' ) )
     set_post_format( $post , get_option( 'default_post_format' ) );
}


原理及說明:當數據庫中有一條或多條狀態為”auto-draft”的自動草稿時,取ID最小的,新文章即使用此條記錄。如果沒有此種類型的數據,才會新 插入一條數據。並且查詢數據時是根據當前的用戶來判斷,不會出現多用戶時出錯。這樣就可以避免了自動草稿(auto-draft)的冗余垃圾數據。保證了 日志ID的連續性。但最后我要提醒一句,如果你在日志中添加了附件,如圖片,那么該圖片也會占用一條數據,即一個連續的ID,所以,如果你以ID形式,發 現日志有時候不是連續的ID了,那么,有可能是你日志的附件占用了臨近的ID。

方法二:(測試出錯)
現在網上很常用的一個禁用自動草稿方法就是在如下代碼

1
if ( $create_in_db )

前加上

1
$create_in_db = false;

這 種方法很方便,也解決了文章發布按鈕一閃一閃的問題。貌似很完美,其實還有一個嚴重的問題,就是你在添加新文章的時候,如果有自定義欄目,字段內容將保存 不了,還會在postmeta表中插入一條無效數據,只有你重新編輯才能保存,所以還是建議采用我的這種方法,可以完美解決,覺得有用的要支持一下哦!

方法三:(測試出錯)
打開wp-admin/includes/post.php,查找$create_in_db,如下

1
2
$post_id = wp_insert_post( array ( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type , 'post_status' => 'auto-draft' ) );
$post = get_post( $post_id );

直接注釋前2行,加入以下代碼,即可關閉WordPress4.1.1的自動草稿功能了,即:

1
2
3
4
5
6
7
8
9
10
11
12
/*
$post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) );
$post = get_post( $post_id );
*/
/* Modified by Lee */
global $current_user , $wpdb ;
$post = $wpdb ->get_row( "SELECT * FROM $wpdb->posts WHERE post_status = 'auto-draft' AND post_type = '$post_type' AND post_author = $current_user->ID ORDER BY ID ASC LIMIT 1" );
if (!( $post ) ) {
     $post_id = wp_insert_post( array ( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type , 'post_status' => 'auto-draft' ) );
     $post = get_post( $post_id );
}
/* End */

還有什么可能沒有解決?
除了上述的這些可能造成文章ID不連續的功能外,WordPress還會在上傳新的文件、添加導航菜單、添加頁面等情況下占用ID,造成文章ID不連續。這種占用沒有太好的方法進行解決。
總之,WordPress的結構設計造成了大家極其反感的文章ID不連續問題,WordPress卻完全沒有修改這種不合理設計的打算。 WordPress加入了一些使用不多意義不大的功能(比如auto-draft),卻對於一些常用功能沒有默認的支持,只能依靠插件或主題,實在有些古 怪。

PS:我發現我用了上面我測試有效的第二種方法和注釋掉了wp_enqueue_script( ‘autosave’ );之后也就禁用了自動草稿的功能呢,你們也可以試試我測試過的方法。我這里匯總的方法包括老版本WordPress和新版本的WordPress的修改方法,有些方法可能不適合,多試幾種就好了,總有一種適合你。

參考網址:
http://www.pythoner.com/27.html
http://www.xp-sem.com/wordpress-disable-revision-auto-draft/
http://www.zhiyanblog.com/wordpress-4-x-continuous-posts-id.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM