今天,我想和你们分享两个或更多独立的wordpress站点如何共享用户数据和cookie来登录和注销。在写这篇文章之前,我在网上查了很多方法。部署后,大部分共享用户数据,但不能共享cookies。比如在a站登录,在哔哩哔哩不能共享cookie,在b站还是要登录一次,这些在线方式比较奇怪的是,哔哩哔哩登录了,但是a站丢失了cookie又注销了,或者a站(主站)登录了可以和哔哩哔哩共享,但是哔哩哔哩登录了但是不能和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源码吧是主站,先简称a站;S.8ym8.com节流学院是另一个独立的网站,在这里我们成为哔哩哔哩。两个站点在程序上是独立的,都有自己独立运行的源程序,与wordpress站点多开放的原理不同。wordpress站点多开放使用同一套wordpress框架源代码,通过不同的域名和主题来实现。
可以尝试登录以上两个站点,体验独立站点之间的共享登录。以下是登录后的效果图。
三、部署A站
按照正常程序安装a站。站点A和B都运行在pagoda服务器环境中。
打开a站根目录下的wp-config.php文件,复制关键信息,准备有用的3360。
1.数据库信息(A1)
/* * WordPress数据库的名称*/define ('db _ name ',' SQL _ XXX _ com ');
/** MySQL数据库用户名*/define ('db _ user ',' SQL _ XXX _ com ');
/** MySQL数据库密码*/define ('db _ password ',' xxxxxxxx ');
/** MySQL host */define( 'DB_HOST ',' 127 . 0 . 0 . 1 ');
/* *创建数据表时的默认文本编码*/
define( 'DB_CHARSET ',' utf8mb 4 ');
/* *数据库排序规则类型。如果不确定,请不要更改*/define( 'DB_COLLATE ',' ')。
2.数据库表的前缀(这里表示为A2)
$ table _ prefix=' wpXXXX _
3.认证密钥字符串,不同的站点密钥是不同的(这里是A3)
define( 'AUTH_KEY ',' q)V9@!T2Xnkb4Q,)BMOhc { fQnKs}cjDGp9?Ul *=k_zN?x=B’);
define( 'SECURE_AUTH_KEY ',' Pz${Eu1b。NewSSPd4N @eyN|LplY,Ot18u,| # W/. HR : eeiof;(lxqy 85 w f’);
define( 'LOGGED_IN_KEY ','?hZR YL?okPiy9GY~9G|_7WUEPAGD4u^pF.uenm/u 72 fjz 7b { 7i _ $ $ kdefine(' auth _ salt ','s8Ng*dTEdx^C?z|(UIKp^CwSp:NVADB Zv
@4td.Q.stmFJtyhPAVzFg)b9' );define( 'SECURE_AUTH_SALT', ',:~S35O>vxi:k;F8ms 1!!BnjouGqRe_o^Uqe9n?|v;%A%fsM8oD6WFRP,|!1z|7' );
define( 'NONCE_SALT', 'Lrvjh^}V8j<
四、部署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):
define('ADMIN_COOKIE_PATH','/');define('COOKIEPATH','/');define('SITECOOKIEPATH','/');define('COOKIE_DOMAIN', '8ym8.com'); //此处修改为你自己的根域名ini_set('session.cookie_domain', '8ym8.com'); //此处修改为你自己的根域名session_start(); 重点解释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'
if ( ! defined( 'COOKIEHASH' ) ) { $siteurl = get_site_option( 'siteurl' ); if ( $siteurl ) { define( 'COOKIEHASH', md5( '8ym8.com' ) ); //次吃换成你的根域名 } else { define( 'COOKIEHASH', '' ); }}到这里完成后,多个独立站点就可以相互共享登录了。
还有一个问题是,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');
大家在配置中有什么问题,欢迎留言,共同学习。