admin 发表于 2025-7-19 08:59:01

独立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框架源码,用不同的域名和主题实现的。大家可以尝试登陆以上两个站点,体验独立站点相互间的共享登录。下面是实现登录后的效果图。https://www.amitufo.net/source/plugin/aljtpbdh/img/20250719/1752886729-9903.jpghttps://www.amitufo.net/source/plugin/aljtpbdh/img/20250719/1752886729-2389.jpg三、部署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)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_$$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两个数据库表,并按如下格式记录如下信息,此处记为A4define( 'CUSTOM_USER_TABLE', '表前缀_users' );define( 'CUSTOM_USER_META_TABLE', '表前缀_usermeta' );在宝塔面板数据库中找到B站的数据库,备份B站点数据库,得到B站点的数据库SQL压缩文案。如下图:https://www.amitufo.net/source/plugin/aljtpbdh/img/20250719/1752886729-2974.jpg再次打开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(); AI写代码
重点解释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', '' );    }}AI写代码
到这里完成后,多个独立站点就可以相互共享登录了。还有一个问题是,wordpress 还需要在所有独立站点设置相同的用户角色,如果需要登录管理账户后同时管理多个站点,还需要给B站点设置管理权限,这一步是在数据库上操作的,大家可以网上查询这方面的资料。九、还没完,还有一个大坑需要解决。如何你的所有站点启用了Memcached缓存(不启用则无需配置第九步),为了使用户信息缓存是一致的,还需设置如下两步:1、在宝塔面板配置PHP(我使用的是PHP7.3),在session配置一项中,缓存模式更改为Memcached。https://www.amitufo.net/source/plugin/aljtpbdh/img/20250719/1752886729-9088.jpg2、在所有站点的根目录下wp-config.php文件中(开始了Memcached才会有如下两项设置),把WP_CACHE_KEY_SALT的值设置为相同值,如我设置了相同的“wwwym”:define('ENABLE_CACHE', true);define('WP_CACHE_KEY_SALT', 'wwwym');大家在配置中有什么问题,欢迎留言,共同学习。

admin 发表于 2025-7-19 09:20:16

WordPress多站共用一个用户数据表,实现用户在任何一站注册即可登录在任何一个站


目前想到的办法是多个WordPress共用一个数据库,适用表前缀作为区分;也就是安装WordPress时看到的“wp_”这个。本次介绍适用三个站做演示,各位大佬也可以使用演示站的数据进行登录和测试。最开始其实打算使用WordPress的网络模式,但是有很多地方不足,很多插件或者主题有冲突,在使用时有的地方还很别手,所以就放弃了。如果大家有什么新的解决办法也可以一起讨论出来。毕竟开源才是贡献,我也很希望帮到大家,因为我一开始就是没有什么人帮我,我真的很感谢张源源当初能在我什么都不懂的时候一点一点带着我写代码,真的非常感谢你们真的感谢!。搭建开始首先我再这里以一个数据库名为“ABCDEFG”及内部包含三个WordPress的数据,表单分别为主数据库表前缀“A_”、分站“B_”、分站“C_”。用户数据我这里存在了A_内。当然你们可以随便弄这个前缀,只要你的站不一样就行。如果你的站没有建在一个数据库内,那么很抱歉,请自行查找修改WordPress数据库表前缀的办法,修改后全部导出,并统一导入到一个数据库内,在您做些时,一定一定要提前做好备份!,全站备份,数据库也记得备份!用户数据站:a1.fohuis.com 分站:b2.fohuis.com 分站:c3.fohuis.com目前我创建了用户为“user2@u.cn”密码为“user2pw”各位可以使用这个账号和密码在这三个网站登陆进行测试看看是不是你们需要的效果(网站不一定会在啥时候关闭,反正文章发布后的三个月肯定不会关)。首先将WordPress安装至一个数据库内,现在您应该有三个表前缀,请您记住这三个表前缀,什么?刚把网站创建完就把表前缀给忘了???好吧,那你的记性和我差不多。如果忘记了请在你网站的目录找到个文件名为“wp-config.php”的文件,那么好请点进去(我这里用宝塔演示)


https://www.amitufo.net/source/plugin/aljtpbdh/img/20250719/1752888056-4266.jpg


就是个这个样子的代码,在差不多68行左右,你就能看到,那么这个就是你网站的数据库标前缀,其他网站的也是这样查看,各位大佬应该都知道的。那么好,到这步你应该已经安装了两个或三个或更多,这个时候只需要你做下一步工作;假如说你有三个网站,你把其中的A_表前缀的网站作为存用户数据的网站,那么这个时候需要你把其他的两个网站甚至更多或者你只建了两个网站,反正就是除了这个网站之外的网站,都需要打开“wp-config.php”这个文件并且需要给他加上一些奇奇妙妙的代码(bushi)正常的代码。define('CUSTOM_USER_TABLE', 'A_users');define('CUSTOM_USER_META_TABLE', 'A_usermeta');
这两行代码是将网站的用户数据使用指定表。那么这两行加载哪呢,加载数据库名和密码那个位置上面就是可以的了,什么?你不会加?请复制我的代码至


https://www.amitufo.net/source/plugin/aljtpbdh/img/20250719/1752888057-7384.jpg


看到了吗,加载这个位置就可以了,我图片里第20和21行,但是你那里有没有加别的东西我就不知道了,反正就是你的数据库配置代码上方即可。此时你的两个站已经链接完了,可以去分站登陆你主站的管理员账号

admin 发表于 2025-7-19 09:24:14

如何在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配置文件,在其中加入如下配置:

define('CUSTOM_USER_TABLE', 'a_users');

define('CUSTOM_USER_META_TABLE', 'a_usermeta');
AI写代码
这两句配置重新声明了_user与_usermeta数据表的名称,这里将其改为需要共享数据的表名称,我是用的是A站的用户数据。

到此,你的A、B两站用户数据共享已经完成,都可以使用A站点的用户数据注册登录,但wordpress在_usermeta表中有对用户权限的记录,到这一步,你的B站虽然可以使用A站的用户数据登录,但不能访问后台,访问会提示用户权限不够。

自动添加用户权限
当你完成上面的步骤时,你的a_usermeta数据表中,并没有记录用户对B站点的访问权限,为了使A站点的管理员用户能拥有B站点的管理权限,我们需要在a_usermeta数据表中插入如下权限记录:

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";}');
AI写代码
在这里解释下,在_usermeta数据表中meta_key的值为_capabilities的记录项就是记录的用户权限,其前缀代表了权限是哪个站点的。由于我的管理员账号是建站时建立的,所以user_id为1。administrator表示管理员权限,其它权限见WordPress移除用户角色添加新角色并赋予角色能力/权限一文。

通过上面的mysql命令,插入用户对B站点的权限后,我们就可以正常访问B站的后台了。注意:记得清理cookies!

如果不会MySQL,你也可以使用phpmyadmin使用鼠标点击a_usermeta数据表中meta_key值为a_capabilities记录项前面的复制链接,phpmyadmin会自动跳转到插入功能并填入相应值,你只需要修改前缀再点击执行即可。

这里我们使用的是手动的方式来赋予用户对B站点的访问权限,我们不可能手动为每一位用户赋予权限,那么我们可以使用如下代码来实现注册时自动赋予权限。

//设置主站的前缀,其它网站都共享该网站的用户数据表

$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,

if( count( $addi_prefixs ) > 0 ) {

foreach( addi_prefixs as prefix ) {

add_user_meta( user_id, prefix.'capabilities',

}

}

}

}
AI写代码

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

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,

if( !empty( $cap_val ) ) {

foreach( prefixs as prefix ){

if( prefix != table_prefix )

update_user_meta( user_id, prefix.'capabilities',

}

}

}
AI写代码

上面的代码仅能自动为以后的用户设置权限,并不能给以前的用户设置权限,所以如果需要为以前的用户设置权限,你需要获取所有用户id,然后循环执行上面插入权限的MySQL。

如果你的用户注册数据中还有别的字段,那么你可能需要参考上面的代码,将数据写入其中。

注意:本文实现的wordpress共享用户数据,仅能共享注册登录,不能实现自动登录。比如如果在A站点登录用户A,当你切换到B站点时,并不会自动为你登录A用户,当然你可以手动登录。出现这种问题的原因是,A、B两个站的域名不同,cookies不能实现跨域。



页: [1]
查看完整版本: 独立wordpress站点之间共享用户数据及cookie登录