同一个WordPress程序建设多个博客:续貂补遗 - 沙渺很忙

同一个WordPress程序建设多个博客:续貂补遗

发表时间2008年11月07日 20:53 分类分类:技术随笔 评论评论:5 条 点击点击:317

我爱水煮鱼denis介绍了使用同一个WordPress程序建设多个独立博客的方法,非常实用。

但是,虽然不必重复安装WordPress程序,甚至可以使用同一个数据库,但不代表每个博客都过一遍install就可以,还有一些选项必须重复设置,更有一些选项不能简单相同。

今天续貂一下,随便写写我在实践中所碰到的一些值得注意的地方。使用的WP版本是2.6.3,等不起2.7了,估计没什么大分别吧?

头等大事:改掉默认的upload目录

每安装完一个wordpress实例,请首先改掉默认的上传目录”wp-content/uploads“。我的建议是加一个子目录,例如域名叫”personal.yourname.com“,就改为”wp-content/uploads/personal

设置不同的uploads目录

为什么这一点是头等大事?理由在于:导出数据时,多个博客上传的文件很难分离。不要轻言“不需要导出”、“不需要搬迁”。要知道变化总比计划快。不做准备,在真的碰到麻烦的时候会后悔的。

注:WordPress在碰到重名文件时会自动改名,新内容不会覆盖旧的,这一点可以放心。

这一点不管用不用wp-hive都要注意!

使用不同的favicon/sitemap/robots.txt

favicon/sitemap/robots.txt是很麻烦的东西,因为它们都在根目录下,都有相同的文件名,但必须每个网站都不一样。所以我们利用Apache的mod_rewrite模块,目的将不同域名下的同名文件,重写到不同的物理文件上。如下图:

进行重写的目的(robots.txt与sitemap同理)

首先,favicon/robots.txt存成不同的文件就可以了。
www.example.com -> favicon_www.ico / robots_www.txt
sub.example.com -> favicon_sub.ico / robots_sub.txt

需要特别注意的是sitemap。因为sitemap是插件生成的,所以需要修改插件的设置,每个博客都要分别修改!。这里以Google XML Sitemaps为例,相信大多数人用的是这个。

如果你不介意将带后缀的“sitemap_后缀.xml”提交给搜索引擎,则直接选“自动检查”,给文件名加后缀就可以了。缺点是搜索引擎可能会重复检索sitemap.xmlsitemap_后缀.xml,不过不用担心,反正是一样的。

如果你是完美主义者,只想让搜索引擎检索sitemap.xml而不管你带后缀的文件,你需要选”自定义设置”。
如下图,在“sitemap路径”中填写您存储文件的绝对路径,在“检索地址”中填写“http://域名/sitemap.xml”。
一般情况下,这样做会引发404错误。这个问题通过mod_rewrite的重写功能解决。

如何设置Google XML Sitemaps插件

通过在wordpress程序的根目录下.htaccess文件中增加以下代码,就可以实现最终的目标:文件重写。请自行修改和增加,每一个网站都需要一组重写规则。
需要注意压缩过的sitemap(sitemap.xml.gz)也要重写的,许多人忘记加。
以下代码必须加在#BEGIN WordPress之前!(如若不然的后果请自行想象)不用管RewriteEngine On的重复,反正也没什么后果。

以下代码重写4个文件favicon.ico / robots.txt / sitemap.xml / sitemap.xml.gz。

# 先确保有重写引擎……
<IfModule mod_rewrite.c>
# 打开重写引擎
RewriteEngine On
# 以下是www.example.com的重写规则
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^favicon.ico$ favicon_www.ico
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^robots.txt$ robots_www.txt
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^sitemap.xml$ sitemap_www.xml
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^sitemap.xml.gz$ sitemap_www.xml.gz
# 以下是blog.example.com的重写规则
RewriteCond %{HTTP_HOST} ^blog.example.com [NC]
RewriteRule ^favicon.ico$ favicon_blog.ico
RewriteCond %{HTTP_HOST} ^blog.example.com [NC]
RewriteRule ^robots.txt$ robots_blog.txt
RewriteCond %{HTTP_HOST} ^blog.example.com [NC]
RewriteRule ^sitemap.xml$ sitemap_blog.xml
RewriteCond %{HTTP_HOST} ^blog.example.com [NC]
RewriteRule ^sitemap.xml.gz$ sitemap_blog.xml.gz
# 结束了
</IfModule>

如果您使用wp-hive插件,请继续阅读以下内容,否则请跳过。

wp-hive插件直接支持重写这三种文件,但是wp-hive是用php重写的,而不是直接使用htaccess。需要在加载index.php之后工作,增加了读取数据库的时间。

同时有一个已知的问题,至少在我所在的主机商上,wp-hive不能成功获取.ico文件的MIME类型,会在函数finfo_file()触发Fatal Error。

所以如果使用wp-hive接管favicon的重写,你也许需要将wp-hive.php
$fmime = finfo_file($finfo, $faviconfile);
改成
$fmime = 'application/x-ico';

当然,如果你执意不使用ico格式的favicon,就需要给$fmime赋别的值。你可以Google查询“扩展名 + Content-Type”来找到你需要的MIME文件类型。

需要重复设置的内容

由于wp-options表是不共享的,所以有些选项必须在每个博客中重复设置。

  1. 更新通知(Ping服务)列表。
    Ping服务是什么?请参考这篇文章第2项。
  2. 永久链接格式。
    我的建议:/2008/11/postname.php,目的是静态化方便,毕竟php比htm的花样多。
    注:我个人非常喜欢将“永久链接”称作“死链”,可不知道当初是谁用“死链”表达了HTTP 404,闹得我也不能玩这个花样。
  3. wp-db-backup插件
    每个博客都需要重复开启,并设定定期备份频率。目的在于自动设置cron jobs。
  4. 分别开启您喜欢的插件。

权限的问题

如果你的每个博客都使用不同的wp_users和wp_usermeta表,那就不构成什么问题。但如果用 CUSTOM_USER_TABLECUSTOM_USER_META_TABLE 两个常量将这两个表统一(详见水煮鱼原文最后一段),就需要特别注意权限共享的问题。

即使wp_users和wp_usermeta表统一,一个用户在不同的博客中也可以有不同的权限。

尤其需要注意的是,一个博客刚走完安装程序之后,只有admin有管理员权限,其他的任何用户没有任何权限,用户角色显示为“无”,就像下图:

权限的问题:无权用户的产生

权限的问题:无权用户的产生

用无权用户登录系统,会出现错误提示“您没有足够的权限访问该页面”。

解决的办法有两种:

  • 简单的方法就是admin一直留着统一使用。
    在WordPress安装程序中,一旦检测到admin已经存在,会提示“用户已存在,密码不变”。所以admin的密码在第一次指定之后就不会被改来改去,可以放心使用admin账户安装、管理所有的博客。
  • 如果你坚持删去默认的admin用户,你在安装完每个博客之后,都要用admin账户登录一次,为你所需要的用户手工加权。在安装完所有博客之后,才能删去admin。

    手工加权

    手工加权

这个权限问题背后的内部机制不太复杂,感兴趣的读者自行研究一下wp_usermeta表就很容易理解。

wp-hive是什么?

wp-hive是一个WordPress插件,用来在一个WordPress程序上架设多个WordPress实例。

它的基本原理是在一切元素加载之前,先根据进入的域名,给变量$table_prefix选定一个适当的值,实现多个博客的表挤在一个数据库里。

wp-hive会在数据库中添加两个表 wphive_config wphive_hosts,其中 wphive_hosts 记录了域名与前缀 $table_prefix 的对应关系。

wp-hive不会修改.htaccess文件。请求无论如何都会进入index.php,但wp-hive会在发现favicon/sitemap/robots时,将每个域名的相应文件直接发出,并给出正确的Content-Type,实际上相当于进行了重写。

当然正如前面所说,wp-hive在重写favicon的时候有点小问题,但有解决办法。

这里无意写wp-hive的详细介绍。请参考官方网站http://wp-hive.com

当然我不建议使用WP-Hive。因为用这个插件的过程还是有点绕圈子的,不是那么直截了当。

最后用一句wp-config.php的话结尾:
/* That's all, stop editing! Happy blogging. */

本文系原创文章。
作者:沙渺
发表位置:沙渺很忙博客 http://shamiao.com
原文链接:同一个WordPress程序建设多个博客:续貂补遗
转载随意,反对抄袭,鄙视采集站。
欢迎任意使用,惟需尊重《创作共用协议 - 署名》,标明作者并链接到原文。



听听大家的说法

“同一个WordPress程序建设多个博客:续貂补遗” 有 5 条评论。
这里有点新鲜的是,新评论显示在最上方。沙发是没有用的。

  1. 沈蚊 说:

    呃……是双/单引号的问题……

    但登录后却提示“您没有权限访问本页面。”……囧

    • 沈蚊 说:

      偶重新安装了,先设置的用户,就没有之前的权限问题了……

      ps.不知道是不是因为2.7版本的原因~~

      • 沙渺 说:

        WordPress的usermeta表中,有user_id、meta_key、meta_value三个关键字段。例如两个分别使用前缀wp1_和wp2_的WordPress实例,可能会产生以下的字段:
        user_id=2, meta_key=”wp1_capabilities”, meta_value=”a:1:{s:13:”administrator”;b:1;}”,则这个表示用户#2,在wp1_中有管理员的权限。

        在存储原理上看,用户与权限之间,存在着一对多的关系。也就是说一个用户,对于不同的WP实例,可以拥有不同的权限。

        所以统一wp_users和wp_usermeta表,只是把同名用户的权限合并,而并不意味着权限就自动实现了共享。可以想象一下两个WP给不同的用户使用,如果权限可以共享,那一定乱套。

        保留admin帐户用来加权总是方便的。曾经有高人说过:平时用author权限写文章,偶尔用administrator权限做管理,我觉得不错。

        用phpmyadmin自己看一下users与usermeta表,也许能有更深刻的体会。

  2. 沈蚊 说:

    我希望共用一套用户系统,但按Denis的方法现在貌似没有合并上……

    偶是在wp-config里面加了两行:

    define(’CUSTOM_USER_TABLE’,”wp_users”);
    define(’CUSTOM_USER_META_TABLE’,”wp_usermeta”);

    请问是这样写么?

    谢谢

  3. LiGht 说:

    真详细,受教了

分享您的观点

在评论中加入您的头像,欢迎了解并注册Gravatar

  1. 启用Akismet过滤广告留言。过滤列表每天检查,合理评论一概不删。如果您的评论未予显示,请您等待。
  2. 允许回复盖楼。在您的评论有新回复的时候,您会收到邮件通知
  3. 我保证尊重您的权益,不向您发送垃圾邮件,并保护您的邮件地址免于泄漏。
  4. 如果遇到行政或司法的调查,我会如实提供您填写的信息。

如果您对以上的提醒不予认可,请慎重发表您的评论。