WordPress多個網站之間共享用戶數據實現方法

wordpress為網站系統提供了相同的數據表結構,為快速實現多個WordPress網站之間共享用戶數據提供了可能。wordpress如何實現如網易通行證等大站一樣的共享用戶登錄呢?只需要將需要共享的數據庫共用即可,我們這裡只需要共享_user與_usermeta表,下面是完整實現過程。

安裝web

首先,準備兩個域名及web環境,我的測試環境是寶塔。

主站A

  • 域名:a.test.com
  • 數據庫名稱:test
  • 數據庫用戶:mytest
  • 數據庫用戶密碼:test123
  • 數據表前綴:a_

從站B

  • 域名:b.test.com
  • 數據庫名稱:test
  • 數據庫用戶:mytest
  • 數據庫用戶密碼:test123
  • 數據表前綴:b_

先安裝A站,使用上述A站配置信息,安裝完畢後,再安裝B站,B站也使用上述信息。注意:為了實現數據共享,我們必須將兩個站的數據表都放在同一個數據庫中,上面我用的test數據庫。

修改wordpress配置

為實現共用用戶數據,我們必須讓兩個站使用的數據表都為a_user與a_usermeta。或者都使用b_user與b_usermeta,我這裡使用的A作為主站,所以我需要把B站使用的b_user與b_usermeta數據表改為使用a_user與a_usermeta數據表。

打開B站wordpress根目錄下的wp_config.php配置文件,在其中加入如下配置:

<code>define('CUSTOM_USER_TABLE', 'a_users');define('CUSTOM_USER_META_TABLE', 'a_usermeta');/<code>

這兩句配置重新聲明瞭_user與_usermeta數據表的名稱,這裡將其改為需要共享數據的表名稱,我是用的是A站的用戶數據。

到此,你的A、B兩站用戶數據共享已經完成,都可以使用A站點的用戶數據註冊登錄,但wordpress在_usermeta表中有對用戶權限的記錄,到這一步,你的B站雖然可以使用A站的用戶數據登錄,但不能訪問後臺,訪問會提示用戶權限不夠。


自動添加用戶權限

當你完成上面的步驟時,你的a_usermeta數據表中,並沒有記錄用戶對B站點的訪問權限,為了使A站點的管理員用戶能擁有B站點的管理權限,我們需要在a_usermeta數據表中插入如下權限記錄:

<code>INSERT INTO `test`.`a_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '1', 'b_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');/<code>

在這裡解釋下,在_usermeta數據表中meta_key的值為_capabilities的記錄項就是記錄的用戶權限,其前綴代表了權限是哪個站點的。由於我的管理員賬號是建站時建立的,所以user_id為1。administrator表示管理員權限,其它權限見WordPress移除用戶角色添加新角色並賦予角色能力/權限一文。

通過上面的mysql命令,插入用戶對B站點的權限後,我們就可以正常訪問B站的後臺了。注意:記得清理cookies!

如果不會MySQL,你也可以使用phpmyadmin使用鼠標點擊a_usermeta數據表中meta_key值為a_capabilities記錄項前面的複製鏈接,phpmyadmin會自動跳轉到插入功能並填入相應值,你只需要修改前綴再點擊執行即可。

這裡我們使用的是手動的方式來賦予用戶對B站點的訪問權限,我們不可能手動為每一位用戶賦予權限,那麼我們可以使用如下代碼來實現註冊時自動賦予權限。

<code>//設置主站的前綴,其它網站都共享該網站的用戶數據表$main_prefix = 'a_';//設置子站的前綴,例如有兩個子站,前綴分別為wpen_和wpcn_$addi_prefixs = array('b_','c_');//添加功能到用戶註冊的鉤子裡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 );}}}}/<code>

或者使用下面的代碼,也行。

<code>add_action( 'user_register', 'dup_capabilities' );add_action('profile_update', 'dup_capabilities');function dup_capabilities( $user_id ){//在這裡設置數據表前綴,不分主站子站,全部寫上即可。$prefixs = array('a_','b_','c_');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 );}}}/<code>

上面的代碼僅能自動為以後的用戶設置權限,並不能給以前的用戶設置權限,所以如果需要為以前的用戶設置權限,你需要獲取所有用戶id,然後循環執行上面插入權限的MySQL。

如果你的用戶註冊數據中還有別的字段,那麼你可能需要參考上面的代碼,將數據寫入其中。

注意:本文實現的wordpress共享用戶數據,僅能共享註冊登錄,不能實現自動登錄。比如如果在A站點登錄用戶A,當你切換到B站點時,並不會自動為你登錄A用戶,當然你可以手動登錄。出現這種問題的原因是,A、B兩個站的域名不同,cookies不能實現跨域。


分享到:


相關文章: