今天與大家一起分享兩個或多個獨立的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框架源碼,用不同的域名和主題實現的。
大家可以嘗試登陸以上兩個站點,體驗獨立站點相互間的共享登錄。下面是實現登錄後的效果圖。
三、部署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壓縮文案。如下圖:
再次打開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。
2、在所有站點的根目錄下wp-config.php文件中(開始了Memcached才會有如下兩項設置),把WP_CACHE_KEY_SALT的值設置為相同值,如我設置了相同的“wwwym”:
define('ENABLE_CACHE', true);
define('WP_CACHE_KEY_SALT', 'wwwym');
大家在配置中有什麼問題,歡迎留言,共同學習。