完美解决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天的自动草稿”的代码语句!

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

早安!