禁用 WordPress 文章修订功能
刚刚接触 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。推荐大家使用第二种方法。
已有 6 条评论 »
很好~~正郁闷着已经修改了wp_config.php了为什么还是有版本产生呢~~~
呵呵~~不过你这里第一种办法和第二种办法没有清晰的分开,让人乍一看还不知道从哪开始是第二种办法呢
@孤毒老鼠
呵呵,当时边测试边写的,比较乱,重新整理了一下。
挺不错的,不过还是没有用第二种方法呢,之前修改过第一种方法管用过一段时间,但是之后升级了版本就不好使了。
直接用插件好了。搜索Super Switch这个插件。
@孤毒老鼠
在这看到老鼠了...
在 wp-config.php 中添加以下代码
怎么不管用呢..难道是版本的原因吗.我的是2.8.6版本
请教一下,如果采取第二种方法,除了对文章有效外,对“页面”也同样有效么?因为新建页面和更新页面也会增加ID号。谢谢。