最近一個客戶要求小編幫他們公司站點做一個英文版本,並且要求中文版和英文版兩個站點的使用者資料可以互通而且不影響站點的正常執行。好吧,開始蛋疼的折騰,首先看了下 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 站點裝在一個伺服器上且共用一個資料的情況下。)