同一个WordPress程序建设多个博客:续貂补遗
我爱水煮鱼的denis介绍了使用同一个WordPress程序建设多个独立博客的方法,非常实用。
但是,虽然不必重复安装WordPress程序,甚至可以使用同一个数据库,但不代表每个博客都过一遍install就可以,还有一些选项必须重复设置,更有一些选项不能简单相同。
今天续貂一下,随便写写我在实践中所碰到的一些值得注意的地方。使用的WP版本是2.6.3,等不起2.7了,估计没什么大分别吧?
头等大事:改掉默认的upload目录
每安装完一个wordpress实例,请首先改掉默认的上传目录”wp-content/uploads“。我的建议是加一个子目录,例如域名叫”personal.yourname.com“,就改为”wp-content/uploads/personal”
为什么这一点是头等大事?理由在于:导出数据时,多个博客上传的文件很难分离。不要轻言“不需要导出”、“不需要搬迁”。要知道变化总比计划快。不做准备,在真的碰到麻烦的时候会后悔的。
注:WordPress在碰到重名文件时会自动改名,新内容不会覆盖旧的,这一点可以放心。
这一点不管用不用wp-hive都要注意!
使用不同的favicon/sitemap/robots.txt
favicon/sitemap/robots.txt是很麻烦的东西,因为它们都在根目录下,都有相同的文件名,但必须每个网站都不一样。所以我们利用Apache的mod_rewrite模块,目的将不同域名下的同名文件,重写到不同的物理文件上。如下图:
首先,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.xml和sitemap_后缀.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表是不共享的,所以有些选项必须在每个博客中重复设置。
- 更新通知(Ping服务)列表。
Ping服务是什么?请参考这篇文章第2项。 - 永久链接格式。
我的建议:/2008/11/postname.php,目的是静态化方便,毕竟php比htm的花样多。
注:我个人非常喜欢将“永久链接”称作“死链”,可不知道当初是谁用“死链”表达了HTTP 404,闹得我也不能玩这个花样。 - wp-db-backup插件。
每个博客都需要重复开启,并设定定期备份频率。目的在于自动设置cron jobs。 - 分别开启您喜欢的插件。
权限的问题
如果你的每个博客都使用不同的wp_users和wp_usermeta表,那就不构成什么问题。但如果用 CUSTOM_USER_TABLE 和 CUSTOM_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程序建设多个博客:续貂补遗
转载随意,反对抄袭,鄙视采集站。
欢迎任意使用,惟需尊重《创作共用协议 - 署名》,标明作者并链接到原文。

2008年11月07日 20:53
分类:
评论:
点击:317 




标签: 


呃……是双/单引号的问题……
但登录后却提示“您没有权限访问本页面。”……囧
偶重新安装了,先设置的用户,就没有之前的权限问题了……
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表,也许能有更深刻的体会。
我希望共用一套用户系统,但按Denis的方法现在貌似没有合并上……
偶是在wp-config里面加了两行:
define(’CUSTOM_USER_TABLE’,”wp_users”);
define(’CUSTOM_USER_META_TABLE’,”wp_usermeta”);
请问是这样写么?
谢谢
真详细,受教了