弦子
Just do IT..

禁用 WordPress 自动保存与历史版本控制[更新至5.2.2]

撤掉禁止 WordPress 自动保存与历史版本控制会造成ID的不连续,对于追求完美的人来说, 对自动保存和历史版本控制功能并不是太感冒, 呵呵。找了下, 汇总了一些关于禁止自动保存和历史版本控制的办法。

以下适用于 Wordpress 5.X 版本。WP 主题模板文件 functions.php 加入代码

//禁用文章自动保存
add_action('wp_print_scripts','disable_autosave');
function disable_autosave(){
wp_deregister_script('autosave');
}
 
//禁用所有文章类型的修订版本
add_filter( 'wp_revisions_to_keep', 'specs_wp_revisions_to_keep', 10, 2 );
function specs_wp_revisions_to_keep( $num, $post ) {
return 0;
}
//只禁用某种文章类型的修订版本
add_filter( 'wp_revisions_to_keep', 'specs_wp_revisions_to_keep', 10, 2 );
function specs_wp_revisions_to_keep( $num, $post ) {
    if ( 'post_type' == $post->post_type ) { //引号中post_type改为你想禁用修订版本的文章类型
        return 0;
    }
    return $num;
}

下面是Wordpress中几种类型
Post (Post Type: ‘post’)
Page (Post Type: ‘page’)
Attachment (Post Type: ‘attachment’)
Revision (Post Type: ‘revision’)
Navigation menu (Post Type: ‘nav_menu_item’)

//——————–分割线——————–// 下面的内容已成为历史。

Wordpress 3.9 开始直接在 wp-config.php 文件里面写入如下代码即可:

remove_action('post_update', 'wp_save_post_revision',10,1);

Wordpress 3.7 版本开始在主题文件加入以下代码 disable autosave.

/* 取消自动保存和修订版本 */
remove_action('pre_post_update', 'wp_save_post_revision');
add_action('wp_print_scripts', 'disable_autosave');
function disable_autosave() {
	wp_deregister_script('autosave');
	}

Wordpress 3.6 版本及以下版本可以用下面的方法
1. 首先在 wp-config.php 文件, 在 if ( !defined(‘ABSPATH’) ) 前面添加以下代码:

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

2. 在 wp-includes/default-filters.php 中, 加 // 注释掉 wp_save_post_revision 这个函数。

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

3. 在 wp-admin/post.php 及 post-new.php 文件中, 继续注释掉

// wp_enqueue_script('autosave');

4. (1) 找到 wp-admin/includes/post.php 文件中的 wp_create_post_autosave 函数, 将该函数的最后一句:

return _wp_put_post_revision( $_POST, true );

改为:

return edit_post();

通过修改这两行代码,即保留了自动保存功能,又去掉了历史记录功能,另一个额外的好处是可以让文章ID连续增长。

(2) 另外也可以从 wp-admin/includes/post.php 文件中找到这段(大概在399行处):

if ( $create_in_db ) {

在它下面找到这部分代码:

$post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) );
$post = get_post( $post_id );

修改为:

$post_auto_draft = $wpdb->get_row( "SELECT * FROM $wpdb->posts WHERE post_type = '$post_type' AND post_status = 'auto-draft' LIMIT 1" );
if ( $post_auto_draft ) {
	$post = $post_auto_draft;
} else {
	$post = get_post( wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) ) );
}

(3) 又或者可以将下面整个代码[我在用的方式]:

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 ( $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' ) );
}

OK, 这些全部搞定了, 自动保存功能还可以用, ID也能够连续了, perfect。

删除已经生产的版本控制命令为:

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重新设置为连续, 设置一个ID就要4条SQL语句, 比如将ID为99的文章修改为ID为88, 需要执行以下语句。

update wp_posts set id = 88 where id = 99;
update wp_term_relationships set object_id = 88 where object_id = 99;
update wp_postmeta set post_id = 88 where post_id = 99;
update wp_comments set comment_post_ID = 88 where comment_post_ID = 99;

文章ID连续了, 但继续发表新文章时, ID还是会从之前不连续时的最大数字往后编。
这时, 修改下 auto_increment 的数值就OK了,即在 phpmyadmin 中执行下面语句:

alter table wp_posts AUTO_INCREMENT=n

n=梳理后的最大id+1, 比如梳理后最后一篇文章的id是50,那么n就设为51。

另外如果觉得修改代码麻烦的, 可以按照 Super Switch 插件, 将“自动保存”和“保存修订版本”设为禁止。

PS: 补充另外一种更加简单有效的办法, 在主题的 functions.php 文件里面加入如下代码即可

wp_deregister_script('autosave');
remove_action('pre_post_update', 'wp_save_post_revision' );

或者

remove_action('pre_post_update', 'wp_save_post_revision' );
wp_deregister_script('autosave');
remove_filter('the_content', 'wptexturize');

这样便可以避免更新升级wordpress版本的时候又去修改源代码的麻煩了。

赞(0)
未经允许不得转载:英文 SEO & SEM Journal » 禁用 WordPress 自动保存与历史版本控制[更新至5.2.2]
分享到: 更多 (0)

评论 5

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址