关闭WordPress 3.1版的自动草稿(auto-draft)(完美版)

2011年03月19日   网站建设   17条评论   7035人围观过  

  实际上很早就升级了自己的WordPress到3.1版,想当然的,也就按照《关闭WordPress 3.0版的自动草稿(auto-draft)功能》来编辑了3.1版的代码从而想关闭自动草稿(auto-draft)功能。一开始自己没注意,升级后几天都没有写文章,后来才发现有同学留言,说以前3.0版的方法失效了,如果那样做,会造成无法发表新文章,或者无法编辑文章,均会提示没有权限操作。

  这个可就复杂了。这个自动草稿对我来说用处不大,虽然之前出过一次错,我编辑了大半天,忘记保存草稿,结果我爸来收菜,造成浏览器卡死,只得强行结束,没法,最后只有重新来写。不过也没事,都是原创,写过的东西立刻回忆就出来,没多大碍。但是对于有洁癖的人来说,ID号连续是种习惯。所以只得凑合着用,我还是有办法让ID连续,不过是手动方式。不关闭自动草稿,每次编辑文章的同时,如果手动保存草稿,就一定会产生一条自动草稿记录,而自己保存的文章被调到下一个ID号。

  原始的方法就是登录phpMyAdmin,然后找到那条草稿记录,将模式由“auto-draft”改为“draft”,此时点击文章列表,就会发现这条名为“自动草稿”的草稿,编辑成新文章发表即可。但是这样就得每次写一篇必须重复上述动作,还是比较的麻烦。

  不过幸好,就是给我提议3.0方法在3.1上失效的Gesion同学研究出了新的方法。实际上,只要懂PHP就可以改了,就是个处理逻辑而已,去掉非要新建自动草稿这个动作,如果有草稿则从编号最小的那个开始调用来发表新文章。

  可惜本人学识浅薄,实在是不懂这个东西,只得照搬Gesion同学的方法。还是一样的,跟3.0版修改的文件一致,找到"/wp-admin/includes/post.php"文件,搜索"$create_in_db",不含引号。可以发现,就是如下代码产生的这个自动草稿(2013 年 8 月 11 日更新,支持最新的 3.6 版):

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 {
	$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 = new WP_Post( $post );
}



  修改业务逻辑,将上述代码用下面代码替代即可(4月6日更新):

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



  注意,如果是WordPress 3.0版(包含3.0.x版)要么删除“// Below is added in 3.1”及后面的 2 行代码,要么就是用3.0版的修改方法。

  修改完毕后上传空间覆盖你的源文件即可!当然,你还需要一个插件,叫做Super Switch,请安装后,将“保存修订版本”和“自动保存”设为禁止,这样才能完美的关闭WordPress的自动草稿功能!

  4月4日更新:此方法实际并非完美,昨天测试才发现,原来这个只能禁止新建文章时候的自动草稿,而新建页面时候的自动草稿却仍然存在,故还在等高人更新完美方法或者制作出相关的插件!

  4月5日更新:又测试出了一些结论,该方法无法新建页面,只要新建页面,无论是保存还是发布都会提示“您尝试编辑这篇文章:“自动草稿” 失败。”

  上面说的新建页面会出现自动草稿的问题,实际后台有两个地方那个仍然会产生,一个是进入后台的主页“控制板”,因为该页默认左上角是含有一个快速发布的编辑器,该编辑器同样会产生自动草稿,另一个就是“页面”页,只要你点击页面,无需“添加新页面”都会产生自动草稿。限于上面说的无法新建页面的问题,目前的方法是去数据库中找到产生的那条自动草稿,将其类型“post_type”从“post”改为“page”,相当于手工在数据库里添加了一条新的页面草稿,然后你再来编辑该条页面草稿,即可成功发布。还好页面不是经常会发布,暂时不影响WordPress的正常使用。

  而对于那条非要出现的自动草稿,实际我们也不必担心,上述修改代码的逻辑,就是当数据库中有一条或多条状态为“auto-draft”的自动草稿时,取ID最小的,新文章即使用此条记录来进行发布。如果没有此种类型的数据,才会新插入一条数据。并且查询数据时是根据当前的用户来判断,不会出现多用户时出错。这样就可以避免了自动草稿(auto-draft)的冗余垃圾数据。保证了日志ID的连续性。所以,上面说的即使产生了自动草稿(auto-draft)也不怕,你只要正常的发表一篇文章,这条自动草稿(auto-draft)就被利用上了,如果有多条自动草稿(auto-draft),就会取ID最小的那条来发表,以保证你的ID是连续的。故还可以说是比较完美的。

  这里再插一句,利用WordPress的附件上传功能来上传图片或是文件时,一个附件会占用一个ID,例如你本文利用WordPress编辑器自带的附件上传功能上传了2个图片,1个压缩包,那么已经被这3个附件占用了3个ID,你的下一篇文章ID将会从目前你本文的ID加上3之后的那个ID。这样也是无法让文章ID连续的。只能说是WordPress的一个小缺憾?不知这样开发的好处,附件完全可以使用一个新的表来保存记录的。例如国内的ZBlog这方面就做得很好。

  4月6日更新:经过gesion同学的再次修正,目前已经能正常的发表文章和页面了,自动草稿虽然会产生,但是能被很好的利用起来,故目前ID已经能够连续,比较完美了,建议各位同学更新!

  • 评论列表:
  •  soping
     发布于 2011-03-28 22:08:16  回复该评论
  • 博主,我在本地测试怎么就还是保存草稿呢?
    •  ShunYea
       发布于 2011-03-30 03:26:20  回复该评论
    • 还需要安装一个Super Switch插件,忘记说了,配合使用才能完美关闭。
  •  gesion
     发布于 2011-04-06 23:33:06  回复该评论
  • 新建页面功能用的太少,以至于修改这个功能时都忽略了,昨天更新了方法,就是让页面和文章都维护各自的自动草稿,不过我没你这么好的习惯,写更新日志的。。。我都写在回复里了,看来有时间得整理一下。
  •  xuetian
     发布于 2011-04-15 10:00:24  回复该评论
  • 我就是想把原来草稿功能恢复,还有就是发布和文章修改功能怎么不出现在管理页面上了?如今文章修改是问题,在新页面上显示还是旧滴.总觉得这新版不适合我这类懒人.
    很希望获得你们懂行的帮助哦...
    谢谢啦.
    •  ShunYea
       发布于 2011-04-16 19:00:05  回复该评论
    • 如果想保留自动草稿,那么你只需要安装文中提到的超级开关并作相应设置,不用按照文中的方法修改代码。管理页面上去掉的话,只需要在右上角的“显示选项”那里设置。
  •  星尔
     发布于 2011-07-18 04:50:00  回复该评论
  • 请教下,安装完后如何清理数据库中的垃圾文件呢?
    •  ShunYea
       发布于 2011-07-18 07:34:47  回复该评论
    • 你所指的安装完是说安装好wordpress?如果是刚装好是没有垃圾文件的,如果你不在乎ID的连续性,你也是不需要去手动清除的,你看本文中原来那段代码,就有自动清理超过7天前自动草稿的代码。
  •  189免费空间资源
     发布于 2013-02-25 08:31:21  回复该评论
  • 不知道支持最新版本的wordpress3.5.1不?
    •  ShunYea
       发布于 2013-03-06 19:13:49  回复该评论
    • 支持的,我一直在用。
      •  189免费资源网
         发布于 2013-03-07 09:35:21  回复该评论
      • 您好!我又来了,我是新手,弱弱的问问,你上面的放代码的,可以左右移动的是怎么搞的呢,效果很喜欢!是插件吗》还是怎么添加呢?我就不耻下问了!
        •  ShunYea
           发布于 2013-03-10 22:25:56  回复该评论
        • 那是个插件,就是代码高亮的插件,有很多,我用的是“SyntaxHighlighter Evolved”。装完后你看看说明,代码放入置顶的标识符里面就可以显示那个效果。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。