wordpress更新好像开始频繁了,前几天,刚升到3.1.1,就提示3.1.2了。
提示有时候不太喜欢写博,就是讨厌数据库后台的post表添加太多的垃圾信息。一个文章始终一个ID那该多好,没有多余的冗余。
一、下面说说三个概念。
自动保存,wordpress编辑文章时,会通过某个定时函数或者触发器,对文章实现自动保存,并返回一个新的版本信息,使得同一文章在数据库后台有多条信息。
修订版本,wordpress发布文章后,通过挂钩的原理,编辑文章时,点击更新后,产生一个修订版本,这个版本也使得同一文章在数据库有多条信息。
自动草稿,wordpress的新增文档页面中,不管不是否输入,只要一打开,就自动会再数据库新增一条auto-draft类型的数据,而每次点击后,如果最新的id是auto-draft类型不会自动覆盖,二十继续新增一条,如果用户点击几次新增页面,而忽然想想要做其他事情,这样数据库就开始变得臃肿,不断被添加空记录。
二、我需要的功能
我需要自动保存,这样就不会在编写文章时,如果提交失败,造成全部数据得重写,但是我不希望自动保存在数据库里面新增版本信息,使一篇文章始终一个ID;在我修改编辑文章时,更新后,不需要修订版本功能,修订版本也是会使得数据库拥有太多冗余数据,也造成文章ID不连续,对一些使用文章ID作为连接的,更要杜绝;为了使数据库没有太多多余数据,并且文章ID连续,必须关闭自动草稿功能。
三、修改方法
(一)参考文章
关闭WordPress 3.1版的自动草稿(auto-draft)(完美版)
WordPress3.1禁用自动保存和历史版本AutoSave & Revisions 手工代码修改方案
(二)关闭修订版本
这个有很多方法,一下三种方法,只用一种即可。
1、修改源代码去掉钩子
在wp-includes/default-filters.php中,可以看到这一行:
add_action( 'pre_post_update', 'wp_save_post_revision' );
将其注释掉,修改后,为
//add_action( 'pre_post_update', 'wp_save_post_revision' );
2、使用插件,关闭修订版本
原理是,插件启用一个函数,去掉这个修订版本的钩子。
remove_action ( 'pre_post_update', 'wp_save_post_revision' );
或者是定义修订版本选项,使其修订版本功能关闭
define('WP_POST_REVISIONS',false);
3、配置文件添加修订版本选项,使修订版本功能关闭
编辑 wp-config.php 文件(博客根目录),在下面代码之前:
define('ABSPATH', dirname(__FILE__).'/');
添加以下代码:
define('WP_POST_REVISIONS',false);
注,define(‘WP_POST_REVISIONS’,false);的这种方法,我现在也不知道可不可用,如果有哪位童鞋使用这种方法可以停止修订版本功能的,留言告知,我好完善该文章,懒了,不想一个一个去测试了。
(三)继续自动保存,关闭自动保存的新增版本
在wp-admin/includes/post.php文件中,搜索”wp_create_post_autosave”,不含引号。找到如下函数:
function wp_create_post_autosave( $post_id ) {
$translated = _wp_translate_postdata( true );
if ( is_wp_error( $translated ) )
return $translated; // Only store one autosave. If there is already an autosave, overwrite it.
if ( $old_autosave = wp_get_post_autosave( $post_id ) ) {
$new_autosave = _wp_post_revision_fields( $_POST, true );
$new_autosave['ID'] = $old_autosave->ID;
return wp_update_post( $new_autosave );
} // Otherwise create the new autosave as a special post revision
return _wp_put_post_revision( $_POST, true );
}
将如下函数
return _wp_put_post_revision( $_POST, true );
替换为
return edit_post();
(四)关闭自动草稿
找到/wp-admin/includes/post.php文件,搜索”$create_in_db”,不含引号。找到如下函数:
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 );
// Below is added in 3.1
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->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;
}
修改 if {}else 之间的函数,修改代码后如下,你可以直接复制粘贴。
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 );
}
/* End */
// Below is added in 3.1
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 {
注else后的函数省略,请对比你文章内的函数修改
经过这一系列的源码修改,终于达到我想要的效果了。
不知道哪位高手,不知道哪个高手能把以上我想要的效果做成一个插件呢?如果现在禁用修订版本的插件,能够重写autosave的规则覆盖,那自动保存就不会出现修订版本喽,可惜,至今找不到如何使用插件覆盖系统自带函数的方法,所以我也放弃了编写插件的愿望,写下此篇文章,记录该功能。
此次修改,能够完美应用与wordpress3.1.2,正在写着这篇文章的时候,也自动保存了很多次,我发布之前,特意到后台数据库查看文章ID,此篇文章依旧只有一条记录。欢迎各位砸砖。
文章不错,谢谢
随手点了下广告
谢谢支持哈。
这个比较赞。
嗯,确实很有用,留下了自动保存,又不会在数据库添加多余数据,这才理想,不过wordpress升级后,又得重改。自动保存还是很有用的,很多人觉得自动保存会产生新版本,就关闭了。现在不用关了。
禁用是必须的
嗯,禁用必须,不过还是要用自动保存的。
话说好像表情不显示啊。
还要继续折腾吧
如果wordpress版本更新了,还是要折腾一次呢。
额。我加载你这篇博文实在是有点慢,加载了10分钟还是没有完全加载出来。
I’m sorry,有可能是google广告造成了。下次你来的时候,欢迎反馈,我把Google广告撤下试试。不行,估计我的进行页面优化了。
还是不知道该用哪个….自动保存不是存为草稿吗?
博主用的是神马方法.你说的太多了.看了有点晕…最后还是不知道最简单的方法是什么…
自动草稿是一打开添加文章页面,数据库就存在记录了,而且还没开始保存草稿,保存的类型和草稿是不一样的。如果你多次打开添加文章页面,而没有输入数据,那数据库就有多条空记录,即使没有保存过,也会出现空记录。
都需要修改程序,下次升级的时候会覆盖掉呀
没办法,如果是发文太多的话,改一下程序没什么,现在不知道有没有办法用插件覆盖默认函数,可以的话,把上面的原理转成插件支持就可以了。可是哥至今未找到方法
赶紧去试一试
如果可以马上升级,嘿嘿
原来你整理了更多的方法啊
嗯,以前的方法不可用了,所以想办法找新的用。
define(‘WP_POST_REVISIONS’,false);WordPress 3.1.3下失效
我是用插件,插件的函数是remove_action ( ‘pre_post_update’, ‘wp_save_post_revision’ );然后在自行修改下面源码。
恩,你上面不是写着测试下么,我就测试了下,加define(‘WP_POST_REVISIONS’,false)的修订版的还是会产生的,注释add_action( ‘pre_post_update’, ‘wp_save_post_revision’ );就不会产生了。
嗯。
这个,好像表情显示不出来。
原来用的是3.1.2 这个方法很给力
想问问 现在最新的3.2可以用这个方法吗? 要是不行的话,我就暂时不升级了.
目前测试可用,我已经升级了
这样修改后是不是还是会有一条自动草稿的记录?
数据库查看,会查找最后一条自动草稿覆盖,所以还是自动草稿会被利用,而不是新增一条记录。