清理WordPress垃圾数据和完美解决文章ID不连续问题

摘要WordPress数据库垃圾信息的清理,主要集中清理wp_options,wp_posts,wp_postmeta三张表,以及文章ID不连续问题的完美解决办法。这个清理WordPress垃圾数据是必须的,至于ID不连续的问题,由是萝卜青菜各有所爱了。

在开始正文之前,建议你去看下我之前写的一篇文章,关于禁用WordPress文章历史修订版本和自动草稿的方法,这是产生垃圾数据的因素之一,建议按禁用掉!言归正传,我们的网站上线后,时间一久,数据库中就会存在很多的垃圾处理,直接影响到你网站的响应速度,唉,WordPress可不是以负载性能见长的。产生的原因有很多,除了之前说的,还有文章编辑修改,更换主题等等,这些垃圾数据主要存在于wp_options,wp_posts,wp_postmeta三张表中。所以,作为蛋疼的站长,我们就有必要清理一下垃圾数据。而关于文章ID不连续问题,之后我会给出详细说明,这个比较特殊一些,我不推荐。如果你使用了post_id作为固定链接,那么可能会改变所有文章的网址,会影响到搜索引擎收录及排名,对SEO不利;如果你用插件建立了与文章对应关系的数据库表,如投票插件等,也将会出现问题,自己衡量一下喽!当然,如果你的站还在本地测试,那在上线前就可以放心大胆的去用了。万变不离其宗,操作前作好数据库备份,切记!

注意,以下所有sql语句或是数据表名中的wp是你数据库前缀,应与你安装时一致,如果不是默认前缀请自行修改再进行相关操作。

1.清理文章历史修订版本

首先禁用掉了文章修订功能,我之前的文章有详细说明,这里就不累述了。接下来,我们可以在 phpmyadmin 中执行如下SQL语句(做好备份):

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision';

执行完毕后,对于老站,这一下可是会清理掉上千条数据哟,挺实在!

2.清理不必要的附件

相信很多博友在发布文章都会同时上传/插入一些附件,如图像、视频、音乐等,这些附件可以在WordPress管理后台 – 媒体库中看到,不同媒体对应了不同的文章。可是你要注意的是这些媒体也是占据着文章ID的,它们与文章都保存在同一个数据库表wp_posts中。如果你特别追求文章的ID一定要完美无缺地连续,请不要在发布文章的时候上传/插入这些媒体,并请在WordPress后台菜单中找到媒体库,删除之前上传的媒体(注意这个操作不只是删除记录,而且会删除你上传的文件),需要的话请用FTP重新上传这些文件。

3.清理wp_options表

wp_options表是用来存贮WP的设置方面的信息,如博客名、博客地址、基本设置、插件设置、主题设置等等。时间久了,这张表会非常之大,10多兆也为过。推荐使用clean-options插件来操作,简单方便。当然,你非插件流,这里也提供一个办法。你可以本地新安装一个wordpress,然后和你现在blog设置一样,导出wp_options的sql,然后将服务器上的wp_options表清空,再导入本地的。此方法有一定风险,如果对数据库不是很了解的话,还是不要冒险试之。

3.清理wp_postmeta表

推荐执行以下语句,清理的是你修改文章时产品的一些冗沉数据,放心用!

DELETE FROM wp_postmeta WHERE meta_key = '_edit_lock';
DELETE FROM wp_postmeta WHERE meta_key = '_edit_last';

以上三步完成后,大部分无用的数据也清理的差不多了。这时,你需进phpmyadmin对这些清理过的数据表进行优化,几个点击的事情,可不能偷懒:)

4.重新排列不连续的文章ID

这点放在最后,就像我开头说明的那样,是不推荐进行的,如果你没ID洁癖,也并不在意这连续不连续问题。
清理代码我直接放上来,直接复制进任意命名utf-8格式的php文件里,上传到你网站根目录,然后运行下即可,操作前记得备份好你的数据库。

这里需要特别注意一点:对固定链接包含%post_id%格式的,不建议使用上述方法。因为会导致你的网站文章链接混乱,对SEO影响很大,请酌情使用。

<?php
/**
 * WordPress重新排列不连续的文章ID
 * 作者 :小拼(Lee)
 * Email:xpsem2010@gmail.com
 * Blog :http://www.xp-sem.com/
 * 文章出处:http://www.xp-sem.com/wordpress-clear-post-id-continuity/
 * 最后修改:2010年11月08日 14:47
 * post_id作为固定链接或是使用投票等关联文章的插件勿用
 * 3.0.1版本亲测,理论上其它版本也适用,操作前请备份好数据库,放心去干吧!
 */

/** 引入网站配置文件,这里主要获得数据库连接信息及常规操作类 */
require_once( './wp-config.php' );

function change_post_id($id)
{
 global $convertedrows, $wpdb;
 /** 修改文章ID关联的类别、标签、自定义字段、评论各表,prefix是您安装时设置的数据库表前缀 */
 $wpdb->query( 'update ' . $wpdb->prefix .'posts set ID = ' . $convertedrows . ' where ID = ' . $id );
 $wpdb->query( 'update ' . $wpdb->prefix .'term_relationships set object_id = ' . $convertedrows . ' where object_id = ' . $id );
 $wpdb->query( 'update ' . $wpdb->prefix .'postmeta set post_id = ' . $convertedrows . ' where post_id = ' . $id );
 $wpdb->query( 'update ' . $wpdb->prefix .'comments set comment_post_ID = ' . $convertedrows . ' where comment_post_ID = ' . $id );

 $convertedrows++;
}
/** ID默认由1开始 */
$convertedrows = 1;

/** 查询数据库文章表所有记录 */
$sql_query = 'SELECT ID FROM ' . $table_prefix . 'posts ORDER BY ID ASC';
$all_post_ids = $wpdb->get_results( $sql_query );

/** 有返回值时则执行循环 */
if ( is_array( $all_post_ids ) ) {
 foreach ( $all_post_ids as $post_id ) {
  change_post_id( $post_id->ID );
 }
}

/** 重新设置文章ID自动增加的起点 */
$wpdb->query('alter table ' . $table_prefix .'posts AUTO_INCREMENT = ' . $convertedrows);

echo 'Total:'. $convertedrows .', It\'s ok! ';

?>

目前留言:4   其中:访客:4   博主:0

  1. 天下第一网

    你说的代码我一直用,可是很奇怪,有的网站有用,,有的网站没用。

    你看我的天下第一网,ID就是不连的。我百思不得其解。

  2. 小拼

    @天下第一网
    这个可能和你的WordPress版本有关系。另外,你的网站固定链接是以%post_id%.html格式设置的,不建议你使用,对网站SEO影响很大。比如http://www.你的域名.com/93.html这篇文章链接可能会变成http://www.你的域名.com/45.html,之前收录的文章也可能也会链接混乱,这在SEO里可能是致命的。

  3. hkmcgogo

    wp_posts表的media类别的东东正在想清除

  4. 黑門書路

    前三个不懂,最后一个很有用,谢谢博主。再请问一个问题:我的博客刚从Z-blog转到WordPress,Z-blog的摘要残留在新系统里,应该怎么删除呢?

评论加载中...

给我留言

图片 表情