撤掉禁止 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版本的时候又去修改源代码的麻煩了。