WordPress3.0版本发布有一段时间了。该版本不仅仅有自动保存历史版本的功能(通常都用不着,还会造成一些垃圾数据),还增加了一个自动保存草稿的功能。你每次点击”add new”时都会在post表中保存一条状态为“auto-draft”的后台不可见记录,同样会造成一些垃圾数据以及ID的不连续性。
为保证尽量减少数据库中的垃圾和保持日志ID的连续性,人们想了很多办法,各显神通。但大部分都是采用插件形式。插件形式仅仅能禁止日志的历史版本,却对自动插入的状态为”auto-draft”的记录无能为力。而且这种记录并不能在wordpress的后台看到。对于追求完美和有洁癖的人来说,这些记录实在是很烦人。
我这篇文章,首先,是原创,亮点在于,我可以不禁止自动保存草稿功能,但依然不生成垃圾数据以及保持日志ID的连续性。我们分两步走,先禁止历史版本,再禁止自动保存草稿。
1.禁止WordPress的历史版本
插件可以禁止历史版本的功能。但如果要禁止历史版本的功能,仅需要修改wp-config.php这个配置文件就可一劳永逸。效率比用插件还高。而且,升级时不会修改wp-config.php,不会造成升级就失效。
方法如下:
在wordpress的程序根目录,配置文件wp-config.php中,找到
define(
'WP_DEBUG'
, false);
在其下方插下以下内容
define(
'WP_POST_REVISIONS'
, false);
define(
'AUTOSAVE_INTERVAL'
, 86400);
解释一下,插入的第一条WP_POST_REVISIONS,看字面意思就知道是禁止历史版本功能。
第二条AUTOSAVE_INTERVAL,这个是禁止自动保存。86400就是一天,自动保存时间设置为一天。比如你在后台添加日志的时候,当输入标题,切换到内容输入时,此时就会自动保存成草稿。当你编辑时,也会定时保存一下,防止你正在编辑的内容丢失。这个草稿是在后台可见的。所以这条根据你的需要来定。如果需要自动保存草稿,这条可以删掉不要。而根据我后面的修改,这条是完全可以删掉的。
2.禁止自动生成 auto-draft 的不可见草稿
读了一下WordPress的代码,我找到一段决定这个功能的地方。
在wp-admin/includes/post.php中,从第374行开始,有一个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
);
}
else
{
我来解释一下这段代码的功能,首先,清除七天以前的自动草稿,然后插入一条新草稿,如果你继续写文章并发布,那么这条草稿就被使用了,包括在后台首页有一个快速发布,也用到了这个。但如果你仅仅是点击了new post(添加文章),接下来没有输入任何内容就跳到别的页面去了或关闭了,此时仍然会生成一个自动草稿,而这个草稿,是后台不可见的,是垃圾数据。
所以我修改了一下代码,将这个if判断中的内容替换成以下内容,代码如下:
if
(
$create_in_db
) {
// modify by akii 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
);
}
// modify by akii end
}
else
{
原理及说明:当数据库中有一条或多条状态为”auto-draft”的自动草稿时,取ID最小的,新文章即使用此条记录。如果没有此种类型的数据,才会新插入一条数据。并且查询数据时是根据当前的用户来判断,不会出现多用户时出错。这样就可以避免了自动草稿(auto-draft)的冗余垃圾数据。保证了日志ID的连续性。但最后我要提醒一句,如果你在日志中添加了附件,如图片,那么该图片也会占用一条数据,即一个连续的ID,所以,如果你以ID形式,发现日志有时候不是连续的ID了,那么,有可能是你日志的附件占用了临近的ID。
最新评论
好文章,内容龙飞凤舞.禁止此
这个主题一万年不变啊 :ra
下雨天就比较纠结了。。 :
这个记录的是用的手机吗?什么
还是偶啊, :razz: