WordPress 3.0 禁止历史版本及自动草稿(auto-draft)的方法

WordPress3.0版本发布有一段时间了。该版本不仅仅有自动保存历史版本的功能(通常都用不着,还会造成一些垃圾数据),还增加了一个自动保存草稿的功能。你每次点击”add new”时都会在post表中保存一条状态为“auto-draft”的后台不可见记录,同样会造成一些垃圾数据以及ID的不连续性。

为保证尽量减少数据库中的垃圾和保持日志ID的连续性,人们想了很多办法,各显神通。但大部分都是采用插件形式。插件形式仅仅能禁止日志的历史版本,却对自动插入的状态为”auto-draft”的记录无能为力。而且这种记录并不能在wordpress的后台看到。对于追求完美和有洁癖的人来说,这些记录实在是很烦人。

我这篇文章,首先,是原创,亮点在于,我可以不禁止自动保存草稿功能,但依然不生成垃圾数据以及保持日志ID的连续性。我们分两步走,先禁止历史版本,再禁止自动保存草稿。

1.禁止WordPress的历史版本

插件可以禁止历史版本的功能。但如果要禁止历史版本的功能,仅需要修改wp-config.php这个配置文件就可一劳永逸。效率比用插件还高。而且,升级时不会修改wp-config.php,不会造成升级就失效。

方法如下:

在wordpress的程序根目录,配置文件wp-config.php中,找到

define('WP_DEBUG', false);

在其下方插下以下内容

define('WP_POST_REVISIONS', false);
define('AUTOSAVE_INTERVAL', 86400);

解释一下,插入的第一条WP_POST_REVISIONS,看字面意思就知道是禁止历史版本功能。

第二条AUTOSAVE_INTERVAL,这个是禁止自动保存。86400就是一天,自动保存时间设置为一天。比如你在后台添加日志的时候,当输入标题,切换到内容输入时,此时就会自动保存成草稿。当你编辑时,也会定时保存一下,防止你正在编辑的内容丢失。这个草稿是在后台可见的。所以这条根据你的需要来定。如果需要自动保存草稿,这条可以删掉不要。而根据我后面的修改,这条是完全可以删掉的。

2.禁止自动生成 auto-draft 的不可见草稿

读了一下WordPress的代码,我找到一段决定这个功能的地方。

在wp-admin/includes/post.php中,从第374行开始,有一个if判断,代码如下:

 if ( $create_in_db ) {
                // Cleanup old auto-drafts more than 7 days old
                $old_posts = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) > post_date" );
                foreach ( (array) $old_posts as $delete )
                        wp_delete_post( $delete, true ); // Force delete
                $post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) );
                $post = get_post( $post_id );
} else {

我来解释一下这段代码的功能,首先,清除七天以前的自动草稿,然后插入一条新草稿,如果你继续写文章并发布,那么这条草稿就被使用了,包括在后台首页有一个快速发布,也用到了这个。但如果你仅仅是点击了new post(添加文章),接下来没有输入任何内容就跳到别的页面去了或关闭了,此时仍然会生成一个自动草稿,而这个草稿,是后台不可见的,是垃圾数据。

所以我修改了一下代码,将这个if判断中的内容替换成以下内容,代码如下:

 if ( $create_in_db ) {
		// modify by akii start
		global $current_user;
		$post_auto_draft = $wpdb->get_row( "SELECT * FROM $wpdb->posts WHERE post_status = 'auto-draft' AND post_author = $current_user->ID ORDER BY ID ASC LIMIT 1" );
		if ($post_auto_draft){
			$post = $post_auto_draft;
		} else {
			$post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) );
			$post = get_post( $post_id );
		}
		// modify by akii end
} else {

原理及说明:当数据库中有一条或多条状态为”auto-draft”的自动草稿时,取ID最小的,新文章即使用此条记录。如果没有此种类型的数据,才会新插入一条数据。并且查询数据时是根据当前的用户来判断,不会出现多用户时出错。这样就可以避免了自动草稿(auto-draft)的冗余垃圾数据。保证了日志ID的连续性。但最后我要提醒一句,如果你在日志中添加了附件,如图片,那么该图片也会占用一条数据,即一个连续的ID,所以,如果你以ID形式,发现日志有时候不是连续的ID了,那么,有可能是你日志的附件占用了临近的ID。

23 thoughts on “WordPress 3.0 禁止历史版本及自动草稿(auto-draft)的方法

  1. Pingback: 优化WordPress自动保存草稿功能 | 找点意思

  2. ycg2u

    好方法,是原创吗。那么如何修改代码使写文章时取ID最小的,新文章即使用此条记录,并不仅限于”auto-draft”的自动草稿。

    Reply
    1. admin Post author

      是的,是原创的。写文章时即生成auto-draft,修改后,如果没有auto-draft,文章ID还会保持最小。因为文章ID是自增的。

      Reply
  3. 西门

    define(‘WP_POST_REVISIONS’, false);
    我只用了这个,和修改下面的if判断
    但是依然会存在post_status为inherit的ID,和我用插件差不多,虽然ID断的少了,但是偶尔还是会有一个inherit出现。

    Reply
    1. admin Post author

      如果你照我的方法修改,是不会有空白无用的id的。如果ID有断续,则应该是你有上传过附件,每个附件也会单独占据一个ID的。

      Reply
  4. Like 9

    你好,不厌其烦地问个问题: 将历史版本和自动草稿(可见和不可见)完全禁止又是怎样加代码呢?

    Reply
    1. admin Post author

      完全禁止不好吧。
      因为,你安装完成后,一进后台,右侧不是有个快速发日志吗?那个load出来时,就会自动创建一篇草稿。此后,只要当前没有草稿,你进入后台,那个快速发日志就会创建一篇草稿。所以完全禁止并不是好的方法。

      Reply
      1. Like 9

        恩.我认真看了文章,请问我的理解有错吗:
        1:加了” define(‘WP_POST_REVISIONS’, false); ” 这个,能完全禁止历史版本.(历史版本对我完全没用.)
        define(‘AUTOSAVE_INTERVAL’, 86400); 也会自动草稿(可见),但时间设为1天一次.(相当于禁止了.)

        2: 假设有N条不可见自动草稿,发新文章时就用ID最小那条,如此类推,把它们都利用.

        Reply
        1. admin Post author

          没错,一点没错。尤其是第2条,不过修改过以后,只会有一条不可见的自动草稿。只要发文章,会自动使用那条记录。所以ID是会保持连续的。

          Reply
  5. Like 9

    既然来了,我还想问怎么用.htaccess文件防盗链,又不会拒绝google,bing等等他们的蜘蛛?谢谢.

    Reply
    1. admin Post author

      使用.htaccess仅仅适用于apache服务器。我没弄过防盗链。网上应该有不少解决方案。
      这个真是爱莫能助了。

      Reply
  6. Chong.Freeman

    发这条评论时,WP 已经升到 3.1.1 版了,不过 post.php 文件的那段代码基本没变,用了博主的方法,很实用。谢谢了

    Reply
  7. Pingback: Wordpress 3.1 去除修订及自动保存的方法 | Heaven's Ubuntu Notepad

  8. Pingback: WordPress 3.0 禁止历史版本及自动草稿(auto-draft)的方法 | 无价之宝博客

  9. passer

    我很喜欢这个方法,并且在我的wordpress3。2。1版本上试用,目前没有发现问题。数据库看上去更紧凑了

    Reply
  10. Pingback: 后记 « Build A WordPress

  11. Pingback: ou的笔记 » 在本机搭建wordpress的一些问题

  12. Pingback: WordPress 禁用自动保存、自动草稿和版本修订历史 | iOS Geek

Leave a Reply

Your email address will not be published. Required fields are marked *

*