WordPress怎么发布文章出现的ID不连续问题

海外服务器 (576) 2015-12-01 14:47:46

WordPress刚接触的时候一点都不太会,自己慢慢的摸索,可能好多都想我只要一个人慢慢学呗,言归正传我使用wordpress的时候写文章遇到的最大的一个麻烦就是所有的文章ID不是数字不是依次而下的而是跳格的,我就产生疑问为什么会这样子,然后打开数据库后台一看,全是草稿,有的有内容,有的直接就是草稿二字,我就不停的测试让我发现了原来只要点击写文章wordpress就会自动存档,而且没发一篇文章就会占用2个ID,后来我上网找别的共享的资料有的说插件,有的说修改后台,但我更倾向于后者。因为插件太多也影响网站速度,增大了服务器的负载。

我查到资料就开始设置了:

首先我禁用wordpress的自动保存功能:

禁用WordPress自动保存功能

直接说方法了,首先打开如下两个文件

wp-admin/post-new.php

wp-admin/post.php

注释掉这行:

//wp_enqueue_script(‘autosave’);

其实这步还没有真的禁掉自动保存功能

接下来,打开wp-admin/includes/post.php,切记是wp-admin/includes/的文件笔者自己就发生这样的错误没在意一直在wp-admin/目录下打开的那个post折腾半天没找

到语句,有个if判断如下:

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

这段代码很简单,先是清除七天以前的自动草稿,然后插入一条新草稿,如果你继续写文章并发布,那么这条草稿就被使用了,包括在后台首页有一个快速发布,也用到了这个。而很诡异的是,如果你后台点了“添加文章”,没有输入任何内容或到别的页面或是关闭了,此时仍然会生成一个自动草稿,文章工作后台不可见的,只能在数据库里才能看到。这个垃圾数据ID不连续杀手。解决方法如下,把上面的那段代码用如下代码替换掉:

if ( $create_in_db ) {

// modify by lee start

global $current_user;

$post_auto_draft = $wpdb->get_row( “SELECT * FROM $wpdb->posts WHERE post_status = ‘auto-draft’ AND post_author = $current_user->ID ORDER BY ID ASC LIMIT 1″ );

if ($post_auto_draft){

$post = $post_auto_draft;

} else {

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

$post = get_post( $post_id );

}

到这里基本搞定自动保存的功能带来的弊端,你在点击写文章的时候其实还会出现你意想不到的事情,或许你不在意但你切换到数据库时候就会发现数据库里面还是有垃圾冗余数据,点击依次添加了2个ID,写文章的时候就会出现一个有内容一个显示自动草稿4个字,这就是和修订版本挂钩了加上这句禁用文章修订版,可以在 wp-config.php文件中添加:

define(‘WP_POST_REVISIONS’, false);

(其他笔者学习来的)原理及说明:当数据库中有一条或多条状态为”auto-draft”的自动草稿时,取ID最小的,新文章即使用此条记录。如果没有此种类型的数据,才会新插入一条数据。并且查询数据时是根据当前的用户来判断,不会出现多用户时出错。这样就可以避免了自动草稿(auto-draft)的冗余垃圾数据。保证了日志ID的连续性。但最后我要提醒一句,如果你在日志中添加了附件,如图片,那么该图片也会占用一条数据,即一个连续的ID,所以,如果你以ID形式,发现日志有时候不是连续的ID了,那么,有可能是你日志的附件占用了临近的ID。

现在网上很常用的一个禁用自动草稿方法就是在如下代码

if ( $create_in_db )前加上

$create_in_db = false;这种方法很方便,也解决了文章发布按钮一闪一闪的问题。貌似很完美,其实还有一个严重的问题,就是你在添加新文章的时候,如果有自定义栏目,字段内容将保存不了,还会在postmeta表中插入一条无效数据,只有你重新编辑才能保存,所以还是建议采用我的这种方法。

综上所属:做完上面那多东西总算大功告成了,然后点击写文章吧,如果你看数据库就会发现还是照样有个自动草稿,但当你关掉写文章页面重新点击的写文章按钮时候ID不会再增加,也就不会再出现一个自动草稿ID了,当你输入文章标题内容后点击发布就会发现那个自动草稿被覆盖了,这就完美解决了。

THE END