Archive

Posts Tagged ‘wp_posts’

升级WordPress遇到的问题

July 11th, 2009 No comments

前两天我在博客里提到我把自己的 Blog 搬家,顺便把wordpress从1.5版本升级到了2.8.1版本。升级的过程并不是一帆风顺,其间遇到了一些数据库方面的问题。

我最初的计划是按照 Yan’s Five Easy Steps 将Blog移植到新主机上。本来Yan的方法简单易懂,按照他的步骤应该很快就能搞定。可是偏偏在第五步,也就是在 phpMyAdmin 中将旧数据库的数据导入到新数据库的时候出问题了。phpMyAdmin 报错,然后提示导入失败。我试了好几次都是同样的结果(后来我想了一下,很有可能 wordpress 在1.5版本之后修改了数据库结构,使得旧数据库的数据无法导入到新数据库)。万般无奈之下,我只好求其次,使用 wordpress 自带的导入/导出功能把旧帖子搬了过来。这个方法似乎解决了问题,因为在我粗略浏览了一下 Blog 后并没有发现什么问题。

但是第二天当我在 wordpress 的 Dashboard 里面进行一些维护工作时发现了一些问题。

  1. 首先是 Dashboard 显示的帖子总数不对,如图一所示。
  2. 从图中可以看到,在 Dashboard 中显示的我的 Blog 帖子总数为105,发表了的帖子数为35。事实上我的 Blog 一共只有35个帖子,一个不多一个不少。那么这凭空多出来的70个帖子是从哪里来的呢?

    WPDashiboard-Posts
    图一、Wordpress的Dashboard里面显示的帖子总数不正确。

    经过仔细检查,我用 phpMyAdmin 发现了 wordpress 数据库的问题。图二显示的是 wordpress 的 wp_posts 表的一个截图。从图中可以看到 wp_posts 中包含有两个 fields:post_statuspost_type。而从表一中可以看到 wordpress 的1.5版本和2.8.1版本对post、page、和 attachment 的处理是不一样的。

    WPDatabaseMess
    图二、Wordpress的wp_posts数据库里的数据有错误。

    表一、Wordpress的1.5版本和2.8.1版本对post、page、attachment的不同处理。

      WordPress 1.5版本 WordPress 2.8.1版本
    post_status post_type post_status post_type
    post (published) publish post publish post
    page static post publish page
    attachment attachment post inherit attachment

    在1.5版本中,post、page 和 attachment 对应的 post_type 都是 post,区分它们的是 post_status。而在2.8.1版本中,post、page 和 attachment 对应的 post_type 各不相同,相应的 post_status 也有少许区别。明白了这点,再回头来看上面的帖子总数问题就容易理解了。原来当 wordpress 导入旧 Blog 的时候沿用了1.5版本的数据,导致所有的post、page 和 attachment 都被 wordpress 认为是 post。因此在 Dashboard 里面显示的帖子总数比实际帖子数多。

    为了改正这个错误,需要在 phpMyAdmin 输入 SQL 命令对 wordpress 数据库进行修改。首先我们要把 attachment 的 post_typepost 改成 attachment,把 post_statusattachment 改成 inherit。相应的 SQL 命令是:

    UPDATE wp_posts SET post_type="attachment" WHERE post_status="attachment";
    UPDATE wp_posts SET post_status="inherit" WHERE post_type="attachment";

    接着我们要把 page 的 post_typepost 改成 page,把 post_statusstatic 改成 publish。相应的 SQL 命令是:

    UPDATE wp_posts SET post_type="page" WHERE post_status="static";
    UPDATE wp_posts SET post_status="publish" WHERE post_type="page";

  3. wp_posts 表中 guid 一栏的网址都是 Blog 移植前的网址,如图二所示。
  4. 我的新 Blog 的地址是 “http://tech.eternj.net”,而 guid 栏里显示的是我的旧 Blog 的网址:”http://highdrawer.strangled.net/blog”,因此需要把 guid 里的地址改正过来。相应的 SQL 命令是:

    UPDATE wp_posts SET guid=REPLACE(guid, 'http://highdrawer.strangled.net/blog', 'http://highdrawer.eternj.net');

    WPDatabaseGuid
    图三、wp_posts 表里的 guid 显示的是旧 Blog 的地址。

  5. wp_posts 表里的 post_parent 栏里的很多数值都是错误的。
  6. 这个问题直接导致在 Dashboard 里面显示 Media 的时候,每个附件和其对应的帖子完全弄混。解决这个问题没有好办法,只有手工修改每一个错误的数值。