完美解决wordpress日志ID不连续问题 包含v3.1、v3.2~v4.0版本

由于老杨有轻度ID控,喜欢干净简单的东西,所以对于新版的wordpress的自动保存草稿功能很是郁闷,它造成了大量的日志ID浪费,也使得日志ID不连续,所以,干掉此功能!!

先说明个情况:ID不连续主要是三功能引起的,一是自动保存功能 Auto-Save,二是历史版本 Post Revisions,三是自动草稿功能 Auto-Draft!基于不同wordpress版本,解决方法不一!请对号选择相应解决方案!

wordpress 3.1 之前版本(不包含3.1):

1、打开 wp-config.php 文件,在 “$table_prefix = 'wp_';” 前面添加如下代码:

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

2、找到并打开 wp-admin\post.php 和 wp-admin\post-new.php 这两个文件,将其 “wp_enqueue_script('autosave');” 注释或删除掉。

//wp_enqueue_script('autosave');

3、找到并打开 wp-admin\includes\post.php 文件,找到 “if ( $create_in_db ) {” ,在它的前一行添加:

$create_in_db = false;

wordpress 3.1 之后版本(包含3.1):

首先继续上述步骤1、2。

自3.1版本开始,程序对自动草稿功能做了修改,上述方法中的第三步会导致后台发布文章时提示没有操作权限!

我们首先还是按照上述方法中的1、2两步进行操作,以实现禁止自动保存 Auto-Save功能和历史版本 Post Revisions功能,下面我们来尝试处理一下禁止自动草稿 Auto-Draft 功能!

由于上述方法中的第三步失效,所以不能再添加 $create_in_db = false; 代码,此时发布文章功能正常,但只要你点击“添加新文章”,无论你是否编辑文章,只要你最后没有点击保存或点击存为草稿(如直接关闭编辑页面),程序都会默认自动添加一篇不可见的自动草稿日志,其标题为“自动草稿”,状态为“auto-draft”,且只能利用phpmyadmin从数据库中删除!因此,如果你没有构思好日志,还是不要轻易点击添加新文章!

下面给出两种还算完美的解决方案,基础代码来自电脑中名为“待处理”的文件夹,已经找不出源出处了,感谢党,感谢互联网,感谢原作者!这里我整理完善一下,分享给各位童鞋,至此,非ID控可以直接跳转到下方评论了哈哈!!

注:下文中提到的行数以 wordpress 4.0 版本为准,以下代码针对 wordpress 3.1~3.9 均有效。

方案一:将不可见的自动草稿 auto-draft 变为可见的草稿日志 draft。

参考上述第3步,找到并打开 wp-admin\includes\post.php 文件,找到 “if ( $create_in_db ) {” ,查找大约 533 行:

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

将上述代码改为:

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

提示:此方案并不能阻止点击“添加新文章”时自动创建草稿,但此时创建的是可以在文章列表看到的草稿日志,可点击编辑!当然,如果你多次点击添加新文章,会产生多条草稿日志,也不太好看吧哈哈!

[推荐]方案二:原理是获取最早一条自动草稿作为当前文章使用,如此可以实现在原有自动草稿功能基础上保持文章ID连续,并去除了删除7天前自动草稿的功能。

依然是找到并打开 wp-admin\includes\post.php 文件,找到 函数 get_default_post_to_edit() 中的  “if ( $create_in_db ) {” ,查找大约 533 至 538 行:

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

替换为

	global $wpdb; // 仅 wordpress 4.0 版本需要添加这句,否则报错 Call to a member function get_row() on a non-object
	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 );
		}
		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 {

上面已经说明了方案二的原理,请需要的童鞋结合代码注释看,方案二的解决方法是,如果数据库已经有不可见的自动草稿日志,那么点击添加新文章时,将不会再自动产生新的不可见自动草稿,而是直接调用最早的一篇不可见草稿作为当前文章所需的数据库记录来使用,同时为避免ID不连续,删除了“删除早于7天的自动草稿”的代码语句!

好了,请各位需要的童鞋对号入座吧,如有更好的建议或不解,留言交流!

早安!

参与评论

游客评论不支持回复他人评论内容,如需回复他人评论内容请
  • 荣耀博客

    不到三百文章,我换主题添加缩略图,文章ID都跑到6千多了,o(︶︿︶)o 唉

    4年前 (2015-03-31)
    回复
    回复荣耀博客
  • 杨俊伟

    看来也是个ID控!如果数据库有备份,可本地重新整理一下再上传吧!

    4年前 (2015-03-31)
    回复
    回复杨俊伟
  • 荣耀博客

    数据库里可以指定ID新建文章吗?

    4年前 (2015-03-31)
    回复
    回复荣耀博客
  • 杨俊伟

    你把这些ID转换成草稿,以后直接在草稿上编辑来发布新文章。

    4年前 (2015-03-31)
    回复
    回复杨俊伟
  • 荣耀博客

    我数据库里直接新建文章指定文章ID,状态为草稿,不用新建文章了直接编辑草稿就可以了,这样比较麻烦,但是到达目的了,等文章基本上ID正常了,再使用这个代码

    4年前 (2015-03-31)
    回复
    回复荣耀博客
  • 杨俊伟

    尽早用吧,避免生成更多的自动草稿

    4年前 (2015-03-31)
    回复
    回复杨俊伟
  • 荣耀博客

    我禁用了

    4年前 (2015-03-31)
    回复
    回复荣耀博客
  • 荣耀博客

    第二个方案我可不可以这样理解,使用此代码后,以前文章不管是修订版或者是自动保占用的文章id,除了多媒体,在新发布文章的时候会重新使用(回收)这些id(修订版和自动保存)并使用,直到之前所有修订版和自动保存的文章id使用完,再使用新的id,并且原发布的文章id不会被重新排序,如果我清理了这些修订版和自动保存的文章id,不知道新发布的文章会不会使用跳过的文章id呢

    4年前 (2015-03-30)
    回复
    回复荣耀博客
  • 杨俊伟

    清理掉的ID不会再重新生成了,会使用最近的ID!排序问题,无论是后台还是前台列表,都可以自行调用排序,比如按日期排序或ID之类的。

    4年前 (2015-03-31)
    回复
    回复杨俊伟
  • 荣耀博客

    看来还是不行,有什么办法可以使用之前跳过的文章ID 作为新文章的ID呢,即使清除了修订版和自动保存的文章

    4年前 (2015-03-31)
    回复
    回复荣耀博客
  • 杨俊伟

    如果那些跳过的ID你没有删除,可批量转为草稿日志(此类教程很多),新建日志的时候编辑这些草稿即可!如果量太大,还是放弃吧!

    4年前 (2015-03-31)
    回复
    回复杨俊伟
  • zhaojiyu

    你好,部分转了你这文。 写的不错。 我稍微了下。
    http://www.zhaojiyu.com/2027.html

    对了,换个首页链吧。我已加。

    8年前 (2011-10-10)
    回复
    回复zhaojiyu
  • 无锡网上超市

    不说 还真没发现ID不连续问题

    8年前 (2011-07-13)
    回复
  • 起落博客

    技术帝啊 高~

    8年前 (2011-07-13)
    回复
    回复起落博客
  • haibor

    过奖过奖,只是极其无聊而已!

    8年前 (2011-07-13)
    回复
    回复haibor
  • 灰指甲的治疗方法

    来踩踩,继续关注一下。

    8年前 (2011-07-12)
    回复
  • led tube

    太爽了,爱死博主了!举双手双脚支持他!

    8年前 (2011-07-12)
    回复
    回复led tube
  • haibor

    爽挂了自负!

    8年前 (2011-07-12)
    回复
    回复haibor
  • haibor

    哥这儿只有废主机废域名。。。

    8年前 (2011-07-12)
    回复
    回复haibor
  • haibor

    哈哈!我看你也算是半个ID控了!实在不想改代码,算了吧,ID不连续还能越来越大哈哈!

    8年前 (2011-07-12)
    回复
    回复haibor