完美自动保存、禁用版本控制、连续文章ID

wordpress更新好像开始频繁了,前几天,刚升到3.1.1,就提示3.1.2了。

提示有时候不太喜欢写博,就是讨厌数据库后台的post表添加太多的垃圾信息。一个文章始终一个ID那该多好,没有多余的冗余。

 

一、下面说说三个概念。

自动保存,wordpress编辑文章时,会通过某个定时函数或者触发器,对文章实现自动保存,并返回一个新的版本信息,使得同一文章在数据库后台有多条信息。

修订版本,wordpress发布文章后,通过挂钩的原理,编辑文章时,点击更新后,产生一个修订版本,这个版本也使得同一文章在数据库有多条信息。

自动草稿,wordpress的新增文档页面中,不管不是否输入,只要一打开,就自动会再数据库新增一条auto-draft类型的数据,而每次点击后,如果最新的id是auto-draft类型不会自动覆盖,二十继续新增一条,如果用户点击几次新增页面,而忽然想想要做其他事情,这样数据库就开始变得臃肿,不断被添加空记录。

 

二、我需要的功能

我需要自动保存,这样就不会在编写文章时,如果提交失败,造成全部数据得重写,但是我不希望自动保存在数据库里面新增版本信息,使一篇文章始终一个ID;在我修改编辑文章时,更新后,不需要修订版本功能,修订版本也是会使得数据库拥有太多冗余数据,也造成文章ID不连续,对一些使用文章ID作为连接的,更要杜绝;为了使数据库没有太多多余数据,并且文章ID连续,必须关闭自动草稿功能。

 

三、修改方法

(一)参考文章

关闭WordPress 3.1版的自动草稿(auto-draft)(完美版)

WordPress3.1禁用自动保存和历史版本AutoSave & Revisions 手工代码修改方案

(二)关闭修订版本

这个有很多方法,一下三种方法,只用一种即可。

1、修改源代码去掉钩子

wp-includes/default-filters.php中,可以看到这一行:

add_action( 'pre_post_update', 'wp_save_post_revision' );

将其注释掉,修改后,为

//add_action( 'pre_post_update', 'wp_save_post_revision' );

2、使用插件,关闭修订版本

原理是,插件启用一个函数,去掉这个修订版本的钩子。

remove_action ( 'pre_post_update', 'wp_save_post_revision' );

或者是定义修订版本选项,使其修订版本功能关闭

define('WP_POST_REVISIONS',false);

3、配置文件添加修订版本选项,使修订版本功能关闭

编辑 wp-config.php 文件(博客根目录),在下面代码之前:

define('ABSPATH', dirname(__FILE__).'/');

添加以下代码:

define('WP_POST_REVISIONS',false);

注,define(‘WP_POST_REVISIONS’,false);的这种方法,我现在也不知道可不可用,如果有哪位童鞋使用这种方法可以停止修订版本功能的,留言告知,我好完善该文章,懒了,不想一个一个去测试了。

(三)继续自动保存,关闭自动保存的新增版本

wp-admin/includes/post.php文件中,搜索”wp_create_post_autosave”,不含引号。找到如下函数:

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 _wp_put_post_revision( $_POST, true );

替换为

return edit_post();

(四)关闭自动草稿

找到/wp-admin/includes/post.php文件,搜索”$create_in_db”,不含引号。找到如下函数:

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 );
    // Below is added in 3.1
    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' ) );
} else {
    $post->ID = 0;
    $post->post_author = '';
    $post->post_date = '';
    $post->post_date_gmt = '';
    $post->post_password = '';
    $post->post_type = $post_type;
    $post->post_status = 'draft';
    $post->to_ping = '';
    $post->pinged = '';
    $post->comment_status = get_option( 'default_comment_status' );
    $post->ping_status = get_option( 'default_ping_status' );
    $post->post_pingback = get_option( 'default_pingback_flag' );
    $post->post_category = get_option( 'default_category' );
    $post->page_template = 'default';
    $post->post_parent = 0;
    $post->menu_order = 0;
}

修改 if {}else 之间的函数,修改代码后如下,你可以直接复制粘贴。

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 );
    }
    /* End */
    // Below is added in 3.1
    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' ) );
} else {

注else后的函数省略,请对比你文章内的函数修改

经过这一系列的源码修改,终于达到我想要的效果了。

不知道哪位高手,不知道哪个高手能把以上我想要的效果做成一个插件呢?如果现在禁用修订版本的插件,能够重写autosave的规则覆盖,那自动保存就不会出现修订版本喽,可惜,至今找不到如何使用插件覆盖系统自带函数的方法,所以我也放弃了编写插件的愿望,写下此篇文章,记录该功能。

此次修改,能够完美应用与wordpress3.1.2,正在写着这篇文章的时候,也自动保存了很多次,我发布之前,特意到后台数据库查看文章ID,此篇文章依旧只有一条记录。欢迎各位砸砖。

{ 发表评论? }

  1. 3shi

    文章不错,谢谢
    随手点了下广告 :grin:

  2. zhiwei

    这个比较赞。

  3. 小羿

    禁用是必须的 :mrgreen:

  4. 先看看

    还要继续折腾吧

  5. Firm

    额。我加载你这篇博文实在是有点慢,加载了10分钟还是没有完全加载出来。

  6. 自说Me话

    还是不知道该用哪个….自动保存不是存为草稿吗?
    博主用的是神马方法.你说的太多了.看了有点晕…最后还是不知道最简单的方法是什么…

  7. 空空裤兜

    都需要修改程序,下次升级的时候会覆盖掉呀

  8. 浩子

    赶紧去试一试
    如果可以马上升级,嘿嘿

  9. 代码回音

    原来你整理了更多的方法啊

  10. Guoy

    define(‘WP_POST_REVISIONS’,false);WordPress 3.1.3下失效

      • Guoy

        恩,你上面不是写着测试下么,我就测试了下,加define(‘WP_POST_REVISIONS’,false)的修订版的还是会产生的,注释add_action( ‘pre_post_update’, ‘wp_save_post_revision’ );就不会产生了。

          • Guoy

            :mrgreen: 感谢下,话说你的表情是Loveyuki blog的表情?

  11. iSayme

    原来用的是3.1.2 这个方法很给力
    想问问 现在最新的3.2可以用这个方法吗? 要是不行的话,我就暂时不升级了.

  12. jixiangac

    这样修改后是不是还是会有一条自动草稿的记录?

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Pingback & Trackback

  1. WordPress - Guoy - Pingback on 2011/06/03/ 16:19