最近一個客户要求小編幫他們公司站點做一個英文版本,並且要求中文版和英文版兩個站點的用户數據可以互通而且不影響站點的正常運行。好吧,開始蛋疼的折騰,首先看了下 WordPress 的官方文檔:《 WordPress 數據結構圖》 發現 WordPress 的用户數據表 (wp_users 和 wp_usermeta) 是相對獨立的,那麼我們就可以直接將兩個站點的用户數據庫共享即可,不用用户數據考慮會對兩個站點中其他數據所造成的影響了。下面小編來説説解決方法:
假設我們有兩個 WordPress 站點,一個為 cn.weixiaoduo.com(數據表前綴為 v7v3cn_) 另一個為 en.weixiaoduo.com(數據表前綴為 v7v3en_),我們將 cn.weixiaoduo.com 作為主站點,將 en.weixiaoduo.com 作為主站的一個英文版的副站點。
首先打開 en.weixiaoduo.com 的 wp_config.php 文件,並加入以下代碼:
define('CUSTOM_USER_TABLE', 'v7v3cn_users'); //v7v3cn_為主站點的數據庫前綴
define('CUSTOM_USER_META_TABLE', 'v7v3cn_usermeta');
加入以上代碼後兩個站點之間的用户數據就實現了初步的互通,但是如果用主站的用户去登錄副站點會提示沒有足夠的權限。原因是因為主站儲存的用户權限值是以 v7v3cn 來開頭的,以主站的管理員為例,管理員用户 ID 為 1,角色是 administrator,則表中就有這樣一條記錄:
user_id->1, meta_key->v7v3cn_capabilities, meta_value->a:1:{s:13:"administrator";s:1:"1";}
而英文副站點的數據庫中卻沒有以 v7v3en_開頭的權限值記錄,所以造成權限不夠的提示。解決方法是運行一下 SQL 語句:
//向數據庫中添加 v7v3en_開頭的權限記錄值
INSERT INTO `dbname`.`wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '1', 'v7v3en_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');
這樣做僅僅使用户 id 為 1 的管理員可以正常登陸這兩個網站,如果創建了新的用户,無論是管理員還是普通用户,都會被提示權限不足,解決方法是在用户的註冊鈎子添加一個 SQL 數據庫操作:
//設置主站的前綴,其它網站都共享該網站的用户數據表
$main_prefix = 'v7v3cn_';
//設置子站的前綴,前綴為 v7v3en
$addi_prefixs = array('v7v3en_');
//添加功能到用户註冊的鈎子裏
add_action( 'user_register', 'dup_capabilities' );
function dup_capabilities( $user_id ) {
global $main_prefix, $addi_prefixs;
//獲取該用户權限的值,因為不同角色的值是不同的
if( $cap_val = get_user_meta( $user_id, $main_prefix.'capabilities', true ) ) {
if( count( $addi_prefixs ) > 0 ) {
foreach( $addi_prefixs as $prefix ) {
add_user_meta( $user_id, $prefix.'capabilities', $cap_val, true );
}
}
}
}
將以上代碼做成一個小插件或者添加到主題的 functions.php 文件,這樣就一勞永逸了。小編在本地測試時用的是 WordPress3.4 版本,未出現任何問題,但是在客户的站點中運用卻報錯了,查了下原因,原來客户那邊的站點用的是 WordPress3.5 版的,3.5 中代碼與 3.4 不太一樣,所以 3.5 或更高版本請使用以下代碼:
add_action( 'user_register', 'dup_capabilities' );
add_action('profile_update', 'dup_capabilities');
function dup_capabilities( $user_id ){
//在這裏設置數據表前綴,不分主站子站,全部寫上即可。
$prefixs = array('v7v3cn_','v7v3en_');
global $table_prefix;
$cap_val = get_user_meta( $user_id, $table_prefix.'capabilities',true);
if( !empty( $cap_val ) ) {
foreach( $prefixs as $prefix ){
if( $prefix != $table_prefix )
update_user_meta( $user_id, $prefix.'capabilities', $cap_val );
}
}
}
用法和上面的代碼一樣,現在兩個站點的用户數據就可以完全互通了。 (PS:以上方法只適用於兩個 WordPress 站點裝在一個服務器上且共用一個數據的情況下。)