升级到WordPress 3.0多站点模式问题探索

本文主要总结开启多站点模式可能会遇到的问题。如果站点本来是单博客模式而不是WordPress MU,在升级到WordPress 3.0多站点(Multisite)模式时会有一些问题。因为打算精简站点文件方便搬家,这几天做了一些测试,根据我的实践做一些记录,备忘。

WordPress 3.0多站点(Multisite)模式默认是不开启的。单博客模式升级到WordPress 3.0模式自然默认也是升级到单博客模式。不过相信有很多朋友跟我一样,升级之后还想开启多站点模式。但是从已有的博客升级到多站点模式会有一些问题,例如:

1、子域名(Sub-Domain)还是子目录(Sub-Directory)的问题

多站点模式的WordPress 3.0与之前的WordPress MU一样,都支持使用子域名来标记每个站点(博客)。子域名(Sub-Domain)方式,也就是使用形如 subdomain.domain.tld 的地址(链接)形式来标记每个站点。而使用子目录(Sub-Directory)方式,也就是使用形如 (www.)domain.tld/siteslug 的地址形式来标记每个站点,其中 /siteslug 就是该站点相对于根域名的站内链接地址,而不是站点内的一个目录。这样的话,如果你本来有个名字叫 siteslug 的目录在主机的根目录下,它们的链接地址都是 domain.tld/siteslug,这就有冲突了。而且实际上主机在解析地址的时候会优先考虑目录而不是通过 mod_rewrite 得到站点地址。这就导致你能访问目录 siteslug 中的文件或程序,却无法访问以 siteslug 为地址的站点。那么你访问该站点的时候就会报错,或者直接转到目录siteslug下的某个对应目录了(如果有的话)。

虽然用子域名让每个站点地址显得很好看,但是它要求主机支持泛域名解析,也就是你要在域名设置中增加一个A记录将 *.domain.tld 泛解析到 (www.)domain.tld。不过很多免费空间并不支持泛域名解析,那样的话你就只能使用子目录形式来开启多站点模式了。

2、既不能用子域名也不能用子目录的问题

实际上这个问题提的不太对,因为我们总能找到解决问题的办法,没有绝不可能之说。但问题是,如果你本来的WordPress安装在根目录,升级后开启多站点模式时安装脚本会提示你只能使用子域名(Sub-Domain)方式, 提示说这是为了避免新的多站点系统的某些链接地址与原来的地址发生冲突,如前所述。该问题曾在WordPress 3.0的开发讨论区引起了比较多的讨论。目前已经拿出了并不完美且很保守的处理方案,那就是在用户开启多站点模式的时候加入一些条件判断,并相应的给出警告。这些警告在完成升级后通过“工具(Tools)——>网络(Network)”试图开启多站点模式时会看到。但遗憾的是,为了保守起见,开发人员设定为如果满足某个条件则直接启用某种安装形式,而不会让你选择。

比如,如果你是升级而来,并不是全新安装,那么开启多站点模式的时候程序就会提示你“由于您的程序不是全新安装,您网络中的站点需要以子域名方式安装”,此时就根本没有选择的余地。那么,如果你的主机或域名不支持泛域名解析呢?或者你只想用子目录的方式安装呢?这不就没得选了?

这种时候,我们需要修改程序代码来使得开发人员添加的判断失效,让你可以忽略链接地址冲突的问题而强制直接以子目录形式安装多站点模式。请参考文章“强制WordPress 3.0以子目录形式安装多站点功能”。

3、链接地址重定向的问题

结合前述1和2两个问题,如果你强制以子目录形式安装多站点功能的话,就涉及到将原来的地址重定向到新地址的问题。要不然你可就丢了之前的PR,Google还会给你提示一大堆的无法访问的链接。这又是每个人都不希望看到的。这时候就需要利用301重定向功能将原来的地址指向新地址。

4、文章导入问题

如果你执行升级,自然就不用导入文章了。但是提醒一下,使用子目录安装多站点模式,第一个站点(主博客)的原来的静态页面(pages)的地址没变还是 www.domain.tld/pageslug 的形式,但是文章分类Tag的基础地址是 www.domain.tld/blog/,即平白多了一节出来。那么,也用前面3中提到的方法重定向吧。同时,分类、Tag还需要在 设置(Settings)——>永久链接(Permalink) 里分别增加一个 category 和 tag 的基础地址,见“升级至WordPress 3.0多站点模式”。

可如果你在同一站点还有另一个独立的WordPress安装在某个目录中,又希望将它合并到这个程序中以站点(子博客)的形式出现呢?

最好你的这另一个博客的内容不是很多,结构不是很复杂,那样的话你就可以简单的使用WordPress本身自带的导出/导入功能将该博客的文章、页面、分类、Tag、评论等等一切导入到该“网络”的新站点(子博客)中。

但是导入的文章其分类和Tag如果有中文字符的话,可能会有些问题。比如将 名称:新闻,slug:news 的Tag导入为名称:news,slug:新闻,那么,你这个Tag的链接就由 www.domain.tld/subblog/tag/news 变成了 www.domain.tld/subblog/tag/新闻。(这里假定你是用子目录形式启用多站点功能,并且为了保持链接不变,你使用原来子博客所在的目录 subblog 作为该网络中新站点(子博客)的别名( slug))碰到这样的事情,恐怕就只好挨个儿的手动修改了。

5、附件导入问题

几乎所有的博客都会在文章中附加图片等附件,如果你的附件保存在本地(通过WordPress编辑器上传的),那么你就需要考虑它的存储位置和链接等问题了。

方便的是,文章中的附件在你执行导入的时候会提示你“是否下载并导入附件”。并且它会自动更新附件的链接(因为除了主(第一个)站点外,其它站点的附件都是放在 wp-content/blogs.dir/{blog_ID}/files/ 目录下的。)

可是你想想,由于前面提到的地址冲突问题,你又不可能让地址为 /subblog 的站点和位于目录 subblog 中的一个老的WordPress同时工作,怎么办?建议先用另一个别名,如 subblognew 来建立新站点,待导入完成后再在控制台里将其别名(slug)更改为 subblog。

6、修改引用地址URI

既然架构变了,某些地址变了,就需要批量修改文章中引用本站内部文章时留下的链接,使之变成现在的链接。可以参考blog域名迁移之迁移wordpress或者安全修改WordPress网站永久链接地址形式里的方法。

嗯,暂时就记得这么多了。这几天已经将我的站点改造完了,现在是运行在单一的WordPress 3.0 RC1 安装上,基本上没有什么问题出现。我会陆续将心得发出来,敬请关注!©

本文发表于水景一页。永久链接:<http://cnzhx.net/blog/update-to-wordpress-3-0-multisite-problem/>。转载请保留此信息及相应链接。

17 条关于 “升级到WordPress 3.0多站点模式问题探索” 的评论

  1. 引用通告: 强制WordPress 3.0以子目录形式安装多站点功能 « 不存在的空间

  2. lonelicloud,你好,我现在正在做博客迁移。
    原博客www.youngxu.com/blog
    新博客kulangsu.org/xumingyang
    如你所见,我目前用了wp自带的导入导出,问题就是很多文章丢失了。
    可否指导一下我,分享一下你迁移的过程和方法?非常感谢。

    QQ4155593
    邮箱:blueyang@gmail.com

    冒昧打扰,盼复。

    • 有关我的迁移经验的文章快准备好了,这几天工作日,太忙,还没来得及发上来。马上就好了,欢迎查看并提出意见。

  3. 引用通告: 升级至WordPress 3.0多站点模式 « 不存在的空间

  4. 引用通告: Tweets that mention 升级到WordPress 3.0多站点模式问题探索 « 不存在的空间 -- Topsy.com

  5. 博主,你好,,
    我也有wp,下午折腾了一下午多站点,,现在我的情况是:
    我有一个博客,原来它在aaa.com/a下,现在我想再增加几个站点,新增的站点在内容上是和原来的a站点平级的(比如说a站记星期一的日志,b站记星期二的日志…)

    现在我的遇到的问题是,因为我有一个首页,它的地址是aaa.com,所以我又不可能把aaa.com/a移到根目录下,所以只能在aaa.com/a的基础上建立多站点。

    可是现在问题出来了:a站点的固定链接只能是aaa.com/a/blog/……,b站点的地址只能是aaa.com/a/b,c站点地址是aaa.com/a/c,等等等,,这样它们就不是平级的了,,

    我想要的情况是,a站台地址是aaa.com/a,b站点地址是aaa.com/b,以此类推,,有什么好的解决方案吗??a站点肯定是不能移到根目录下的了,因为有一个首页作为所有网站的导航。。

    PS:后来我想出一个方法是:
    把aaa.com/a主站点的wp-config.php文件要求默认填入的
    $base = ‘/a/’;
    define( ‘DOMAIN_CURRENT_SITE’, ‘aaa.com’ );
    define( ‘PATH_CURRENT_SITE’, ‘/a/’ );
    改成
    $base = ‘/’;
    define( ‘DOMAIN_CURRENT_SITE’, ‘aaa.com’ );
    define( ‘PATH_CURRENT_SITE’, ‘/’ );
    后,新建的站点域名可以变成aaa.com/b。当然现在访问也没用,因为我还没有在根目录下建立一个b文件夹。然后,我把a文件夹复制了一个,改名成b文件夹,aaa.com/b站点终于可以访问。但是,这时b站点下原来的所有插件和文章分类等信息都没有了,好困惑,难道又得重新激活插件、加分类、加标签…?,,这又有解决方案吗??

    两个问题,,谢谢阿,帮帮我。。

    也不知你回复时有没有邮件提醒….

    • 你的问题前面我看着很明白,可是到了后面有些不理解了。你的b站点是利用安装在/a目录下的WP3的多站点功能建立的,为什么还要建立一个/b文件夹呢?直接在WP中编辑b站点的内容不就行了?
      鉴于我的理解,如果你希望保存所有分类、标签等信息,最好用WP自带的导出/导入功能,或者参考这里的方法利用数据导入。我的另一篇文章“升级至WordPress 3.0多站点模式”里也提到过。但是插件是肯定要重新设置的。
      因为这个问题比较复杂,但是肯定有方法解决。如果你觉得需要跟我进一步讨论,请你到我的讨论区相应板块新建一个话题,这样比较方便查看,也方便为其他人提供参考,谢谢!

    • 又,对于你的第一个问题,你的解决方法看起来就挺好的,只是我担心这样一来,你直接访问网站域名的时候会打开WP的首页而不是你原先的首页。
      我觉得,如果你的服务器支持链接重写(url Rewrite),你可以将aaa.com/a/b/重写为aaa.com/b/。例如:
      RewriteBase /
      RewriteRule ^a/b/(.*)$ b/$1

      • 我也是和范特兄一样的苦恼。
        我想问问,有没有可能,aaa.com/a/b 绑定为b.aaa.com呢?

        求解,感谢loneicloud兄。

        • 可以,但是需要你的主机空间的DNS管理支持泛域名解析。
          设置方法:
          1、添加域名A记录,*.aaa.com your_IP
          2、在aaa.com的根目录下编辑 .htaccess 文件,加入下面的url重写规则:


          RewriteEngine On
          RewriteBase /
          Rewrite ^aaa.com/a/b/(.*)$ b.aaa.com/$1 [R=301]

          [重写规则可能不一定正确,我这里没办法测试,大意是这样的,如果有问题可以再跟我联系]

  6. 引用通告: 天天博客电脑站 » 怎样开启 WordPress 3.0 的多站点功能

  7. 引用通告: 如何让WordPress 3.0成为多站点模式 | 神经元

  8. 请教…… 域名泛解析生效了,多站点模式已经开启了,但是用子站点访问不了,是不是要绑定域名什么的?

    • 按照一般的设置,像你这样设置就可以了,不需要额外去绑定域名。如果子域名不能访问子站点,你看看是不是 .htaccess 文件没有按照要求写。
      不能访问的可能原因有很多,需要根据错误提示以及测试结果来判断。

  9. 如果是WINDOWS2003系统,如何处理伪静态呀???

    • 这个要看你用的是什么服务器程序进行处理。
      比如我在单位用的 Windows 2003 的系统,但是我使用的是 XAMPP 作为服务器,可以照样用 mod_rewrite (.htaccess)来处理链接重写规则。
      其它的没有研究过,不敢乱说。

  10. 引用通告: 对 WordPress Lazy Load 图片延迟加载插件稍作改进 | 水景一页

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)