pzg's blog

禁用 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。推荐大家使用第二种方法。

《 “禁用 WordPress 文章修订功能并只留自动保存功能的方法” 》 有 3 条评论

  1. Lony 的头像

    你好,看到这篇介绍很详细,谢谢分享这么有用的东西。我也刚用上Revision Control这个插件,真的很不错。但还是要配合修改代码才能让自动保存覆盖原始文件。
    但按照文章意思应该是在最后一行添加return edit_post();这句,而不是文中的“改成”吧?

  2. crossyou 的头像

    可以让文章ID连续增长?,我不明白的是上传媒体时的信息,为何也保存在posts表中,既然这样文章ID怎么会连续?

  3. yumanutong 的头像

    3.X版本可以用吗?貌似用过插件不行,用过第二种方法不行,第一种没试过

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注