2009-04-11

禁用 WordPress 文章修订功能

11+

刚刚接触 WordPress 的时候就发现,除了发文章会使用 posts 表的 ID 外,上传图片、增加新的页面都会占用 ID,这样使得我们的文章 ID 变得很不连续,另外还有一个令个人博客感到烦恼的是 WordPress 的文章修订记录,它不但会占用 posts 表的 ID ,在我们发布文章之后它基本上就没有什么用处了。特别是在编辑一些技术性文章时经常会反复编辑很多次,而每一次修订 WordPress 都为我们保存在 posts 表里,不光是文章,就是自定页页面也是如此。对于团队博客来讲是不错的功能,对我而言,不但占用我的数据库空间,还影响我的 ID 连续,如果用文章 ID 来做永久链接,将惨不忍睹。

禁用 WordPress 文章修订功能的方法也有几种。

一、网上流行的禁用 WordPress 文章修订功能的方法:

在 wp-config.php 中添加以下代码:

define('WP_POST_REVISIONS', false);

关于 WP_POST_REVISIONS 这个变量的详细设置为:

true(默认)或者 -1:保存所有修订版本
false 或者 0:不保存任何版本(除了自动保存的版本)
大于 0 的整数 n:保存 n 个修订版本(+1 只保存自动保存版本),旧的版本将被删除。

另外,在 wp-settings.php 中,搜索 WP_POST_REVISIONS 可以看到这里的预定义,把:

$default_constants = array( 'WP_POST_REVISIONS' => true );

修改为:

$default_constants = array( 'WP_POST_REVISIONS' => false );

还是建议在 wp-config.php 增加代码来完成,毕竟升级博客后,wp-config.php 是不会被替换的。

参阅官方的说明:Revision Management

-----------

如果你觉得添加代码很麻烦的话,可以使用现成的插件来处理,比如:

super-switch - No Revisions - Revision Control

像 Delete-Revision 插件的作者和前阵子在网上看到一位博友的文章中有提到在 wp-config.php 中增加的代码并不能很好的终结文章修订功能,提出了另一种修改方法,既屏蔽了 WordPress 文章修订功能,同时保留了自动保存功能。摘录如下:

-----------

二、禁用 WordPress 文章修订功能并只留自动保存功能的方法(推荐):

WordPress 之所以能生成修订版,是因为在更新一篇文章之前,先执行了挂在“pre_post_update”钩子上的函数。在 wp-includes/default-filters.php 中,可以看到这一行:

add_action( 'pre_post_update', 'wp_save_post_revision' );

这样每次修改都会自动调用 wp_save_post_revision 这个函数来创建修订版记录。我需要做的就是把这一行注释掉,这样就不会在 Update 后生成修订版了。

但仅仅改了这一行还不行,有一种情况仍然会产生修订版。那就是在修改已经发布的文章时,自动保存功能会产生新的修订版。我们可以在 wp-admin/includes/post.php 文件中,找到 wp_create_post_autosave 函数。通过阅读代码和注释,可以知道如果正在编辑的文章还没有自动保存过,就会创建一个修订版。为了让它仅仅起到保存的作用,需要将最后一行的

return _wp_put_post_revision( $_POST, true );

改成:

return edit_post();

整个函数如下:

function wp_create_post_autosave( $post_id ) {
	$translated = _wp_translate_postdata( true );
	if ( is_wp_error( $translated ) )
		return $translated;
 
	// Only store one autosave.  If there is already an autosave, overwrite it.
	if ( $old_autosave = wp_get_post_autosave( $post_id ) ) {
		$new_autosave = _wp_post_revision_fields( $_POST, true );
		$new_autosave['ID'] = $old_autosave->ID;
		return wp_update_post( $new_autosave );
	}
 
	// Otherwise create the new autosave as a special post revision
	//return _wp_put_post_revision( $_POST, true );
	return edit_post();
}

通过修改这两行代码,即保留了自动保存功能,又去掉了历史记录功能,另一个额外的好处是可以让文章ID连续增长。唯一不好的是需要修改源代码,这样在升级 WordPress 以后又要重新做一次。

-------------

我看了上面几个与之相关插件的代码:

super-switch 是直接增加定义来处理,类似在 wp-config.php 中加代码的方法。
No Revisions 是使用代码 ‘@remove_action ( 'pre_post_update', 'wp_save_post_revision' );’来处理,即上面第二种方法中的第一步(1.0)。
Revision Control 这个插件处理得比较好,多语言,可以设置关闭文章的多版本功能和页面的多版本功能,还可以设置最多保留几个修订版本(1.9.1)。推荐使用。

要清理已经存在的文章修订记录,可以使用插件:Delete-Revision

也可以自动动手来处理,执行 SQL (注意按顺序执行):

DELETE FROM wp_postmeta WHERE post_id IN (SELECT id FROM wp_posts WHERE post_type = 'revision');
DELETE FROM wp_term_relationships WHERE object_id IN (SELECT id FROM wp_posts WHERE post_type='revision');
DELETE FROM wp_posts WHERE post_type='revision';

如果要将 ID 重新设置为连续,可以使用月光博客提供的 SQL,每修改一个 ID 需要更新 4 条语句,如把 ID 59 修改为 58 :

UPDATE wp_posts SET id = 58 WHERE id = 59;
UPDATE wp_term_relationships SET object_id = 58 WHERE object_id = 59;
UPDATE wp_postmeta SET post_id = 58 WHERE post_id = 59;
UPDATE wp_comments SET comment_post_ID = 58 WHERE comment_post_ID = 59;

-------------

最后,我只使用了修改 wp-config.php 的方法,既然官方提供了这个设置,应该会有效吧,我先试试,因为目前我使用的是 WordPress2.7.1 的版本,如果行,可能上面提到的第二种修改方法是出自于这之前的版本。

------呵呵,刚刚试过了,修改 wp-config.php 的方法在修改已经发布的文章时,自动保存时会创建 Revision ,在更新文章后,会又创建 Revision 。现在试试 Revision Control 插件,毕竟这只是后台的功能,这个插件对前台没有影响。
PS:我不太喜欢装很多插件,崇尚简洁,追求速度。

使用 Revision Control 插件后,完美禁用 WordPress 文章修订功能,文件编辑时自动保存会创建新的 ID 记录。再来,现在试试第二个修改代码的方法。

------呵呵,这一次是真正的解决了这个问题,自动保存功能可用,自动保存时不再是草稿,而是直接替换原发布的内容,不再产生新的 ID ,更新文章不再产生 Revision。推荐大家使用第二种方法。

本文有 11 篇评论 ↓↓

  1. 孤毒老鼠

    很好~~正郁闷着已经修改了wp_config.php了为什么还是有版本产生呢~~~
    呵呵~~不过你这里第一种办法和第二种办法没有清晰的分开,让人乍一看还不知道从哪开始是第二种办法呢

  2. @孤毒老鼠
    呵呵,当时边测试边写的,比较乱,重新整理了一下。

  3. 挺不错的,不过还是没有用第二种方法呢,之前修改过第一种方法管用过一段时间,但是之后升级了版本就不好使了。

  4. 直接用插件好了。搜索Super Switch这个插件。

  5. @孤毒老鼠
    在这看到老鼠了...

    在 wp-config.php 中添加以下代码
    怎么不管用呢..难道是版本的原因吗.我的是2.8.6版本

  6. bobu

    请教一下,如果采取第二种方法,除了对文章有效外,对“页面”也同样有效么?因为新建页面和更新页面也会增加ID号。谢谢。

  7. 晚上回去捣鼓下,但愿能奏效,自动保存的版本太烦了

  8. 谢谢,原来一直用插件来实件,回头看看给config加个代码,,,

  9. 对不懂代码的盆友 还是插件简单些,但会影响网站加载速度

  10. 不错,分析地很透彻!赞一个!

  11. 不错,分析地很透彻,尤其是WP_POST_REVISIONS的分析,给我指明了分析的方向!赞一个