真正实现独立的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框架源码,用不同的域名和主题实现的。

大家可以尝试登陆以上两个站点,体验独立站点相互间的共享登录。下面是实现登录后的效果图。

三、部署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', '?<h<ZR YL?okP&iy9GY~9G|_7WUE>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 Zv@4td.Q.stmFJtyhPAVzFg&#8)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<N.=#2e%JrR7SGCp)aZ],FHMn,tnuS-q0v763,' );

四、部署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文件

/wp-includes文件夹下找到 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');

大家在配置中有什么问题,欢迎留言,共同学习。

本文由 8源码吧 作者:liaolong 发表,其版权均为 8源码吧 所有,文章内容系作者个人观点,不代表 8源码吧 对观点赞同或支持。如需转载,请注明文章来源。

发表评论