Beyond the Void
BYVoid
Wordpress OOP 一拖多实现

现在在一个空间上只放一个Wordpress已经无法满足我的需要,以前总是上传多个Wordpress,分别维护管理。但是每当插件更新或者WP更新的时候,维护起来很麻烦。

看过CMB的http://www.cbmland.com/post/544/oop-use-wordpress-as-class.html后,我也进行了这方面的尝试,但是还会出现很多问题,例如永久链接。今天我终于解决了这些问题。

明确一点,Wordpress把一个博客所有的配置信息都写入了数据库,文件上仅仅是程序和主题,这样,我们只需根据访问来源的不同,给别给与两个设置即可。“面向对象”形容得很恰当。

在这个空间上,我也有两个Wordpress博客,域名分别是/blog和,http://pal.byvoid.com,两个博客共用/home/myself/www/blog下面的Wordpress程序。我把wp-config.php修改一下

<?php
if($_SERVER["HTTP_HOST"]=="byvoid.com")
{
define('DB_NAME', 'user');
define('DB_USER', 'user');
define('DB_PASSWORD', 'password'); 
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
$table_prefix  = 'wp_'; 
define ('WPLANG', 'zh_CN'); 
}
else if ($_SERVER["HTTP_HOST"]=="pal.byvoid.com")
{
define('DB_NAME', 'user');
define('DB_USER', 'user');
define('DB_PASSWORD', 'password');
define('DB_HOST', 'localhost'); 
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
$table_prefix  = 'pal_wp_'; 
define ('WPLANG', 'zh_CN'); 
}
if ( !defined('ABSPATH') )
	define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php');
?>

经过这样修改,根据来源的不同,Wordpress会读取两套不同的数据库设置,从而实现OOP。通过这种方法,我们理论上可以1拖无限个博客。

但是仅仅这样还是会出现问题,Rewrite永久链接会出错。

为什么为出错呢?因为我们只对Wordpress进行了OOP改造,但是.htaccess文件还是没有分别。例如我的博客,byvoid.com的根目录为/home/myself/www,而pal.byvoid.com的根目录为/home/myself/www/blog,可以理解为后者是前者的子集。

修改byvoid.com的永久链接时,Wordpress会在/home/myself/www/blog文件夹向.htaccess文件自动写入

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>
# END WordPress

而修改pal.byvoid.com时,Wordpress又会在.htaccess写入

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

于是发生了冲突,两个博客的Rewrite永久链接总是会有一个无法使用。于是,我考虑,.htaccess时都可以像wp-config.php一样实现判断呢?看过mod_rewrite的用法,终于有了解决方案。

我们可以使用RewriteCond进行来源判断,只需把.htaccess改成以下内容即可


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{SERVER_NAME} ^byvoid.com
RewriteRule . /blog/index.php [L]

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{SERVER_NAME} ^pal.byvoid.com
RewriteRule . /index.php [L]

</IfModule>

# END WordPress

修改过后,两个博客的永久链接都可以使用了。这种方理论上也可以推广到多个博客。

注意,只有虚拟主机的设定中,当前目录选项有AllowOverride All时,.htaccess才能用。.htaccess如何在Windows下建立,不用我说了吧?cmd下rename一个其他文件为.htaccess就行了。关于.htaccess文件,可以看看介绍

BYVoid原创。


上次修改时间 2017-05-22

相关日志