Beyond the Void
BYVoid
Wordpress OOP 一拖多實現
本文正體字版由OpenCC轉換

現在在一個空間上只放一個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

相關日誌