如何在WordPress网站之间共享用户和登录

许都 255 5

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

  1. define('CUSTOM_USER_TABLE', 'a_users');
  2. define('CUSTOM_USER_META_TABLE', 'a_usermeta');

这两句配置重新声明了_user与_usermeta数据表的名称,这里将其改为需要共享数据的表名称,我是用的是A站的用户数据。

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

自动添加用户权限

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

  1. 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";}');

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

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

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

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

  1. //设置主站的前缀,其它网站都共享该网站的用户数据表
  2. $main_prefix = 'a_';
  3.  
  4. //设置子站的前缀,例如有两个子站,前缀分别为wpen_和wpcn_
  5. $addi_prefixs = array('b_','c_');
  6.  
  7. //添加功能到用户注册的钩子里
  8. add_action( 'user_register', 'dup_capabilities' );
  9.  
  10. function dup_capabilities( $user_id ) {
  11.  
  12. global $main_prefix, $addi_prefixs;
  13.  
  14. //获取该用户权限的值,因为不同角色的值是不同的
  15. if( $cap_val = get_user_meta( $user_id, $main_prefix.'capabilities', true ) ) {
  16.  
  17. if( count( $addi_prefixs ) > 0 ) {
  18.  
  19. foreach( $addi_prefixs as $prefix ) {
  20.  
  21. add_user_meta( $user_id, $prefix.'capabilities', $cap_val, true );
  22.  
  23. }
  24. }
  25. }
  26. }

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

  1. add_action( 'user_register', 'dup_capabilities' );
  2. add_action('profile_update', 'dup_capabilities');
  3. function dup_capabilities( $user_id ){
  4. //在这里设置数据表前缀,不分主站子站,全部写上即可。
  5. $prefixs = array('a_','b_','c_');
  6. global $table_prefix;
  7. $cap_val = get_user_meta( $user_id, $table_prefix.'capabilities',true);
  8. if( !empty( $cap_val ) ) {
  9. foreach( $prefixs as $prefix ){
  10. if( $prefix != $table_prefix )
  11. update_user_meta( $user_id, $prefix.'capabilities', $cap_val );
  12. }
  13. }
  14. }

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

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

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

发表评论 取消回复
表情 图片 链接

  1. TT Lv 1

    为什么按照你的步骤,不能实现共享cookie呢,注销倒是共享了。

    • 许都 站长

      @TT文章已更新[aru_12]

  2. 紫苏 Lv 3

    应用场景不多啊。

    • 许都 站长

      @紫苏毕竟少部分人有这个需求

  3. 博学老头 Lv 1

    不错,学习了

分享