disable-revisions-and-autosave插件下载wodrpress禁用自动草稿和文章版本

2014年7月10日 发表评论 阅读评论

wordpress自动草稿和文章版本会增加增加wordpress冗余的文章ID,让国内的ID控们无法忍受,然而,我们可以通过多种方式来禁用这个自动保存和增加文章版本的功能,网上已经有很多wordpress禁用自动草稿和文章版本的文章,而本文将带你走进这个禁用的绝杀版。

再度更新

之前的代码不好记,最后更新为最终版本,此版必杀!打开/wp-admin/includes/post.php,搜索

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

3.4.1是在420行,直接将这一行整行替换为下面的几行代码

$noUsePosts = $wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_status='auto-draft' OR post_type='revision'");
foreach($noUsePosts as $noUsePost){
	wp_delete_post($noUsePost->ID,true);
}
$existPosts = $wpdb->get_col("SELECT ID FROM $wpdb->posts");
for($i = 1;in_array($i,$existPosts);$i ++)$max_id = $i;//$max_id指的是从1开始连续的ID中最大的一个
$wpdb->insert($wpdb->posts,array('ID' => $i,'post_title' => __('Auto Draft'),'post_type' => $post_type,'post_status' => 'auto-draft'));
$post_id = $wpdb->insert_id;
$newAutoIncrementId = $wpdb->get_var("SELECT MAX(ID) FROM $wpdb->posts") + 1;//新的自动增加的起点
$wpdb->query("ALTER TABLE $wpdb->posts AUTO_INCREMENT = $newAutoIncrementId");

这样既可完成绝杀功能。

代码更新

// Cleanup old auto-drafts and revision

$where = "post_status = ‘auto-draft’ OR post_type = ‘revision’";

$old_posts = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE ".$where);

foreach ( (array) $old_posts as $delete )

wp_delete_post( $delete, true ); // Force delete

$wpdb->query("ALTER TABLE $wpdb->posts AUTO_INCREMENT = 1");

// what added by developer is end

将上面这段代码放在wp-admin/includes/post.php中的  if ( $create_in_db ) {}else中括号内的所有代码前面即可,【拷贝上面的代码,搜索if ( $create_in_db ) {,回车黏贴再回车】无需再修改整个函数。这段代码的原理也非常简单:删除所有符合$where中条件的文章,你可以修改$where值,记住,这里是sql标准语句的WHERE字句;删除指定的文章后,使用ALTER TABLE $wpdb->posts AUTO_INCREMENT = 1将所有插入记录的自动增加起点又送回1,即数据库自动增加的字段ID已经丧失了主动自动增加功能,而是被迫在每一次插入之前检查,将起点重新设为1。


首先,让我们来解决一下wordpress中版本revisions的问题。

其实新的版本控制对于多人写作是有好处的,然而我们很少去考虑一篇文章会有很多个人来写,并产生无数个版本,这会占用我们的数据库空间,这会让我们尖叫。当然,我们可以用一个叫revision-control的插件来设定我们想要的版本数量。而对于个人站长来说,这些太多余了,就让我们什么版本都不要,只要一个最终版。

在插件disable-revisions-and-autosave中,只给出了一段代码来禁用文章版本:

define(‘WP_POST_REVISIONS’, false);

disable-autosave.zip (Right Click – Save As) – Disable Autosave function

disable-revisions.zip (Right Click – Save As) – Disable Revisions function

disable-revisions-and-autosave.zip (Right Click – Save As) – Disable Revisions and Autosave at the same time.

而在上面的同样一个下载页面的另一个插件disable-revisions中,给出了相对比较多的代码:

register_activation_hook(__FILE__, ‘wp_disable_revisions_install’);

/**

* Delete all entries of revisions in database

*

* @global $wpdb WordPress database connection

* @return $wpdb->query

*/

function wp_disable_revisions_install() {

global $wpdb;

$sql = "

DELETE

`a`, `b`, `c`

FROM

`" . $wpdb->prefix . "posts` `a`

LEFT JOIN

`" . $wpdb->prefix . "term_relationships` `b` ON (`a`.`ID` = `b`.`object_id`)

LEFT JOIN

`" . $wpdb->prefix . "postmeta` `c` ON (`a`.`ID` = `c`.`post_id`)

WHERE

`a`.`post_type` = ‘revision’

";

// Clean tables

$wpdb->query($sql);

// Optimize tables

$wpdb->query("OPTIMIZE TABLE `" . $wpdb->prefix . "postmeta`, `" . $wpdb->prefix . "posts`, `" . $wpdb->prefix . "term_relationships`");

}

/**

* Set define WP_POST_REVISIONS to zero

*/

define (‘WP_POST_REVISIONS’, 0);

/**

* Remove revisions actions in post.php

*/

remove_action(‘pre_post_update’, ‘wp_save_post_revision’);

综合上面两个,我给出的最终代码是:

register_activation_hook(__FILE__, ‘wp_disable_revisions_install’);

/**

* Delete all entries of revisions in database

*

* @global $wpdb WordPress database connection

* @return $wpdb->query

*/

function wp_disable_revisions_install() {

global $wpdb;

$sql = "

DELETE

`a`, `b`, `c`

FROM

`" . $wpdb->prefix . "posts` `a`

LEFT JOIN

`" . $wpdb->prefix . "term_relationships` `b` ON (`a`.`ID` = `b`.`object_id`)

LEFT JOIN

`" . $wpdb->prefix . "postmeta` `c` ON (`a`.`ID` = `c`.`post_id`)

WHERE

`a`.`post_type` = ‘revision’

";

// Clean tables

$wpdb->query($sql);

// Optimize tables

$wpdb->query("OPTIMIZE TABLE `" . $wpdb->prefix . "postmeta`, `" . $wpdb->prefix . "posts`, `" . $wpdb->prefix . "term_relationships`");

//$wpdb->query("ALTER TABLE $wpdb->posts AUTO_INCREMENT = 1");

}

/**

* Set define WP_POST_REVISIONS to zero

*/

define(‘WP_POST_REVISIONS’,false);

/**

* Remove revisions actions in post.php

*/

remove_action(‘pre_post_update’, ‘wp_save_post_revision’);

几乎和第二段代码差不多,当然也有细小的差别。

其次,我们来完成对自动草稿的控制

其实草稿也是有好处的,我个人还是比较喜欢自动保存草稿,起码我不再担心自己辛苦写了很久的文章会突然跳线全部泡汤。然而对于其他朋友们不是这样,他们讨厌由于草稿带来的文章ID增加和数据库冗余。

使用下面的代码禁用自动保存草稿

define(‘AUTOSAVE_INTERVAL’,false);

function disable_autosave() {

wp_deregister_script(‘autosave’);

}

add_action( ‘wp_print_scripts’, ‘disable_autosave’ );

如此简单?哦,不,请接着往下看。

最后,解决问题的终极手段

上面的代码虽然可以解决自动保存草稿的问题,然而还有两个严重的问题让你极其纠结:

1、即使禁用的自动保存草稿,当你打开控制面板时,或进入到撰写文章页时,wordpress的逻辑是先为你创建一个草稿,如果你最后将它发表了,它就变成了正常的文章,而不幸没有发表就跳线,或其他原因离开撰写页面,那么这个草稿留在了你的数据库里。

2、即使上面这个问题对你产生的烦恼已经够严重了,还有一个问题将更让你没有办法:即使不再自动产生草稿和其他版本,而且你已经按照网上的一些方法把多余的记录去除掉了,可是以前的文章已经不连号了,你的文章ID已经上升到了1000~2000的一个范围。

更新,下面的代码再度更新,可以删除由于更新文章产生的版本,这个版本是由于我开启了自动保存草稿功能产生的,本站目前实现了开启自动保存草稿的功能,以后不用担心突然跳线的问题,而同时禁用了自动文章版本,总之几乎可以实现完美。而如果你参与了本站的wordpress扩展库计划,还将发现在wp_disable_autosave.php文档中有更为严格的控制。扩展库正是本站正在使用的,也是本站能够实现上述功能的最终办法。

杀手锏代码:

/**

* 于此同时,为了让你的文章慢慢恢复到ID连续的状态,需要用下面的函数代替wp-admin/includes/post.php中的get_default_post_to_edit函数

* /

function get_default_post_to_edit( $post_type = ‘post’, $create_in_db = false ) {

global $wpdb;

$post_title = ”;

if ( !empty( $_REQUEST['post_title'] ) )

$post_title = esc_html( stripslashes( $_REQUEST['post_title'] ));

$post_content = ”;

if ( !empty( $_REQUEST['content'] ) )

$post_content = esc_html( stripslashes( $_REQUEST['content'] ));

$post_excerpt = ”;

if ( !empty( $_REQUEST['excerpt'] ) )

$post_excerpt = esc_html( stripslashes( $_REQUEST['excerpt'] ));

if ( $create_in_db ) {

// Cleanup old auto-drafts

$old_posts = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_status = ‘auto-draft’ OR post_type = ‘revision’");

foreach ( (array) $old_posts as $delete )

wp_delete_post( $delete, true ); // Force delete

$postsID = $wpdb->get_col("SELECT ID FROM $wpdb->posts");

$i = 1;

while(1){

if(in_array($i,$postsID)){$i++;}

else{break;}

}

$wpdb->insert($wpdb->posts,array(

‘ID’ => $i,

‘post_author’ => get_current_user_id(),

‘post_type’ => $post_type,

‘post_status’ => ‘auto-draft’,

‘post_title’ => __( ‘Auto Draft’ )

));

$post_id = $wpdb->insert_id;

$post = get_post( $post_id );

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’ ) );

$post_id = $post_id + 1;

$wpdb->query("ALTER TABLE $wpdb->posts AUTO_INCREMENT = $post_id");

} else {

$post = new stdClass;

$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;

}

$post->post_content = apply_filters( ‘default_content’, $post_content, $post );

$post->post_title = apply_filters( ‘default_title’, $post_title, $post );

$post->post_excerpt = apply_filters( ‘default_excerpt’, $post_excerpt, $post );

$post->post_name = ”;

return $post;

}

wordpress的逻辑全部由于这个函数引起,当进入到有撰写的页面时,就会激活该函数,而令人郁闷的是wordpress如果不产生这个草稿,就不让我们发布文章,你根本无法提交某篇文章。按钮会变成提交审核,提交之后变成一个死页面。因此我们必须让这个草稿存在,但是我们却可以在下次写文章之前把这个草稿给删除。总之太奇妙了。

而我给出的这个函数的绝杀之处在于,它拥有了更美妙的作用,你不用再去理会产生的多余的草稿了,它将帮你删除,更可爱的是,它从ID=1开始重新检查你的数据库,把新增的文章ID变为可以与前面的数值连号的数字,太奇妙了。

不信你可以尝试查看乌徒帮最近的文章,你会发现这些ID已经回到100以下,神奇了吧。

当然你还会遇到一个问题,当wordpress系统升级时,这些代码就被新系统的代码覆盖掉了。而且我也希望可以找到更好的方法,不去修改系统文件即可完成这一切,但目前尚未找到。当你的ID号码全部都已经回到连续,或你可以不再计较于此的时候,把它换为原系统的代码吧,修改它我总觉得哪里不妥的样子。

最后,这也是永远无法解决的问题:我想要的效果是,保留自动保存草稿功能,而自动保存的草稿并不新建一条记录,而是在原文章记录的基础上进行自我保存,这样不仅不会造成记录冗余,而且编辑文章时不用点击发布就可以更新文章,这才完美。


转载请注明来自:[MSN Spaces]http://msn.shandian.biz/712.html

  1. 可乐
    2015年3月24日18:55 | #1

    我想咨询您,你的代码到底应该如何使用呢? 能否给个教程!谢谢!

  2. 可乐
    2015年3月24日18:57 | #2

    现在是否需要将您这篇文章提到的所有代码都换掉!还是?谢谢!