真正實現獨立wordpress站點之間共享用戶數據及cookie登錄

今天與大家一起分享兩個或多個獨立的wordpress站點如何共享用戶數據及共享cookie登錄、退出。寫本文之前我已查考網上的很多方法,部署後大部分做到了共享用戶數據,但不能共享cookie登錄,如在A站登錄了,B站不能共享cookie,B在還是需要登錄一次。網上的這些方法更奇怪的是B站登錄了,反而A站失去了cookie退出登錄了,或者是A站(主站)登錄了可以共享給B站,但B站登錄了卻不能共享給A站。總之,不能做到AB站之間相互共享登錄。問題在哪裡呢,接下來為你揭秘,如何你有這方面的應用需求,可以參考本文的方法。

一、前提條件

實現多個獨立的wordpress站點共享用戶數據及cookie登錄的一個前提條件是,記住了哦,非常重要!!只能實現同一個域的域名下實現,如根域名是8ym8.com,則www.8ym8.com,二級域名a.8ym8.com,b.8ym8.com。。。。等等都屬於同一個域的域名。兩個不同域名(如baidu.com和taotiao.com),是不能實現的,這是由web瀏覽器的cookie機制決定的,無論你服務器端怎麼配置,客戶端瀏覽器始終不會讓你配置的不能域名現實cookie共享,否則這個世界不是亂了套了?

二、開始之前先體驗效果

www.8ym8.com 8源碼吧為主站,先簡稱為A站;s.8ym8.com 油門學院為另外一個獨立站點 ,在這裡我們成為B站,兩個站點在程序上是相互獨立的,他們都有自己獨立的運行源碼程序,這點和wordpress站點多開原理是不一樣的, wordpress站點多開使用的是同一套wordpress框架源碼,用不同的域名和主題實現的。

大家可以嘗試登陸以上兩個站點,體驗獨立站點相互間的共享登錄。下面是實現登錄後的效果圖。


真正實現獨立wordpress站點之間共享用戶數據及cookie登錄


真正實現獨立wordpress站點之間共享用戶數據及cookie登錄


三、部署A站

按正常的程序安裝好A站。A、B兩個站點均在寶塔服務器環境下運行。

打開A站根目錄下wp-config.php文件,拷貝關鍵信息,備著有用:

1、數據庫信息(記為A1)

/** WordPress數據庫的名稱 */define( 'DB_NAME', 'sql_XXX_com' );

/** MySQL數據庫用戶名 */define( 'DB_USER', 'sql_XXX_com' );

/** MySQL數據庫密碼 */define( 'DB_PASSWORD', 'XXXXXXXXXX' );

/** MySQL主機 */define( 'DB_HOST', '127.0.0.1' );

/** 創建數據表時默認的文字編碼 */

define( 'DB_CHARSET', 'utf8mb4' );

/** 數據庫整理類型。如不確定請勿更改 */define( 'DB_COLLATE', '' );

2、數據庫表前綴(此處記為A2)

$table_prefix = 'wpXXXX_';

3、身份驗證密匙串,不同的站點密匙是不一樣的(此處記為A3)

define( 'AUTH_KEY', 'q[D-3dZP)r{4])V9&@!T2Xnkb4Q,)BMOhc{fQ;nKs}cjDGp9?Ul+*=k_zN?x=B' );

define( 'SECURE_AUTH_KEY', 'Pz${Eu1b.NewSSPd4N @eyN|LplY,Ot18u,|#W/.hR:EEIoF;(LxQy85w+f' );

define( 'LOGGED_IN_KEY', '?PAGD4u^pF.UenM/U72fjz7b{7I_$K[t)#b' );define( 'NONCE_KEY', 'stRUl-E!!~FM}[Us%@Ds,?T>E&2.7)kE6,KQ2fE @o~hH8kk5.d9/NWvGeBno?jL' );

define( 'AUTH_SALT', 's8Ng*dTEdx^C?z]|(UIKp&^CwSp:NVADB [email protected])b9' );

define( 'SECURE_AUTH_SALT', ',:~S35O]vxi:k;F8ms 1!!BnjouGqRe_o^Uqe9n?|v;%A%fsM8oD6WFRP,|!1z|7' );


define( 'NONCE_SALT', 'Lrvjh^}V8j[[c)CV1@ekaN7_;3


四、部署B站

按獨立站點的方式安裝好B站,記得在安裝時取與A站不同的數據庫表前綴。

五、數據庫導入

獨立站點要共享用戶數據,只能使用同一個數據庫,我們使用的是A站點的 users和usermeta用戶數據庫表(兩個表有表前綴,此處省略)作為多個獨立站點的用戶數據共享,其他數據庫表則是獨立的。

在寶塔面板數據庫中找到A站點數據庫並打開,找到users和usermeta兩個數據庫表,並按如下格式記錄如下信息,此處記為A4

define( 'CUSTOM_USER_TABLE', '表前綴_users' );define( 'CUSTOM_USER_META_TABLE', '表前綴_usermeta' );

在寶塔面板數據庫中找到B站的數據庫,備份B站點數據庫,得到B站點的數據庫SQL壓縮文案。如下圖:


真正實現獨立wordpress站點之間共享用戶數據及cookie登錄

再次打開A站點數據庫,導入B站點的數據庫備份文件,在操作前最好先備份好A站點的數據庫,以備不急之需。另外,由於兩個站點使用不同的表前綴,B站點數據庫導入A站點數據庫時是不會覆蓋A站點原有的數據庫表,只會增加B站點的數據庫表。

六、編輯A站點根目錄下wp-config.php文件

1、在原有的A3信息上加上如下兩行,後面的32位字符可以自己另外取值。(此兩個密匙串在此處記為A5)

define('SECURE_AUTH_SALT', 'T{|$,t--3W~DdZPO]$3rigO-;E_;%I;g?7;X.b-A?5HL|9ywvagQQFs-TR4KBT');

define('SECRET_SALT','Q$QuHIfQO^(CtrL5D(fcG$miB,fE2]-~::qoB,O_?o|TfgNfQB/x/kv$Tg1Aa7Hf');

2、加入共享cookie配置。

關鍵點就在這裡。網上的方法之所以不能時間獨立站點之間共享cookie登錄,是因為配置還不完善,導致不同站點在與瀏覽器進行session會話時,經過我在調取瀏覽器session會話信息發現不同站點寫入的session值是不一樣的,這樣理所當然是不同共享了。

在“/* 好了!請不要再繼續編輯。請保存本文件。使用愉快! / /* WordPress目錄的絕對路徑。 */” 這句話上面加上下面的配置語句(此處即為A6):

<code>define('ADMIN_COOKIE_PATH','/');
define('COOKIEPATH','/');
define('SITECOOKIEPATH','/');
define('COOKIE_DOMAIN', '8ym8.com');         //此處修改為你自己的根域名
ini_set('session.cookie_domain', '8ym8.com');  //此處修改為你自己的根域名session_start(); /<code>

重點解釋define('COOKIE_DOMAIN', '8ym8.com'); 和session_start(); 兩個語句,網上的教程缺少的就是這兩句,導致session會話值不同。此處設置session會話期間的主域名,保證與瀏覽器會話期間多個獨立站點有相同的session.cookie_domain值,後面的域名填寫你自己網站的根域名(注意是根域名,雖然主站域名是www打頭的)。還要在後面加上session_start();語句,保證前面的設置能夠執行。


七、編輯B站點根目錄下wp-config.php文件

1、 把A1數據庫信息複製並覆蓋掉B站原有的數據庫信息

2、複製A4用戶數據庫表複製到 “/**#@+ *身份認證密鑰與鹽。”這句話的上面

3、把A5、A3 兩部分的驗證密匙串複製並覆蓋掉B站原有的驗證密匙串

4、在同樣的位置,加入A6的cookie配置信息到B站

八、修改A、B兩個站點的下 default-constants.php文件

大約在225行,對於 define( 'COOKIEHASH', md5( $siteurl ) ); 這一句,如果不修改,還會導致兩個站點寫入的COOKIEHASH值不同而導致不能共享登錄,所以要把$siteurl換成很域名 'xxx.com'

<code>if ( ! defined( 'COOKIEHASH' ) ) {   
  $siteurl = get_site_option( 'siteurl' );   
  if ( $siteurl ) {        define( 'COOKIEHASH', md5( '8ym8.com' ) );    //次吃換成你的根域名  
                  } else {        define( 'COOKIEHASH', '' );    }
}/<code>

到這裡完成後,多個獨立站點就可以相互共享登錄了。

還有一個問題是,wordpress 還需要在所有獨立站點設置相同的用戶角色,如果需要登錄管理賬戶後同時管理多個站點,還需要給B站點設置管理權限,這一步是在數據庫上操作的,大家可以網上查詢這方面的資料。

九、還沒完,還有一個大坑需要解決。

如何你的所有站點啟用了Memcached緩存(不啟用則無需配置第九步),為了使用戶信息緩存是一致的,還需設置如下兩步:

1、在寶塔面板配置PHP(我使用的是PHP7.3),在session配置一項中,緩存模式更改為Memcached。


真正實現獨立wordpress站點之間共享用戶數據及cookie登錄

2、在所有站點的根目錄下wp-config.php文件中(開始了Memcached才會有如下兩項設置),把WP_CACHE_KEY_SALT的值設置為相同值,如我設置了相同的“wwwym”:

define('ENABLE_CACHE', true);

define('WP_CACHE_KEY_SALT', 'wwwym');


大家在配置中有什麼問題,歡迎留言,共同學習。


分享到:


相關文章: