【wordpress多站点用户共享教程备份】wordpressV3.5二次开发教程:多站点的用户数据共享

最近一个客户要求小V帮他们公司站点做一个英文版本,并且要求中文版和英文版两个站点的用户数据可以互通而且不影响站点的正常运行。好吧,开始蛋疼的折腾,首先看了下wordpress的官方文档:《wordpress数据结构图》发现wordpress的用户数据表(wp_users和wp_usermeta)是相对独立的,那么我们就可以直接将两个站点的用户数据库共享即可,不用用户数据考虑会对两个站点中其他数据所造成的影响了。下面小V来说说解决方法:

假设我们有两个wordpress站点,一个为cn.v7v3.com(数据表前缀为v7v3cn_)另一个为en.v7v3.com(数据表前缀为v7v3en_),我们将cn.v7v3.com作为主站点,将en.v7v3.com作为主站的一个英文版的副站点。

首先打开en.v7v3.com的wp_config.php文件,并加入以下代码:

define('CUSTOM_USER_TABLE''v7v3cn_users'); //v7v3cn_为主站点的数据库前缀
define('CUSTOM_USER_META_TABLE''v7v3cn_usermeta')

加入以上代码后两个站点之间的用户数据就实现了初步的互通,但是如果用主站的用户去登录副站点会提示没有足够的权限。原因是因为主站储存的用户权限值是以v7v3cn来开头的,以主站的管理员为例,管理员用户ID为1,角色是administrator,则表中就有这样一条记录:

user_id->1, meta_key->v7v3cn_capabilities, meta_value->a:1:{s:13:"administrator";s:1:"1";}

而英文副站点的数据库中却没有以v7v3en_开头的权限值记录,所以造成权限不够的提示。解决方法是运行一下SQL语句:

//向数据库中添加v7v3en_开头的权限记录值

INSERTINTO`dbname`.`wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES(NULL, '1','v7v3en_capabilities''a:1:{s:13:"administrator";s:1:"1";}');

这样做仅仅使用户id为1的管理员可以正常登陆这两个网站,如果创建了新的用户,无论是管理员还是普通用户,都会被提示权限不足,解决方法是在用户的注册钩子添加一个SQL数据库操作:

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

$main_prefix= 'v7v3cn_';
//设置子站的前缀,前缀为v7v3en
$addi_prefixs= array('v7v3en_');
//添加功能到用户注册的钩子里
add_action( 'user_register''dup_capabilities');
functiondup_capabilities( $user_id) {
    global$main_prefix, $addi_prefixs;
    //获取该用户权限的值,因为不同角色的值是不同的
    if( $cap_val= get_user_meta( $user_id,$main_prefix.'capabilities', true ) ) {
      if( count( $addi_prefixs) > 0 ) {
       foreach( $addi_prefixsas$prefix) {
        add_user_meta( $user_id, $prefix.'capabilities',$cap_val, true );
       }
      }
    }
}

将以上代码做成一个小插件或者添加到主题的functions.php文件,这样就一劳永逸了。小V在本地测试时用的是wordpress3.4版本,未出现任何问题,但是在客户的站点中运用却报错了,查了下原因,原来客户那边的站点用的是wordpress3.5版的,3.5中代码与3.4不太一样,所以3.5或更高版本请使用以下代码:

add_action( 'user_register''dup_capabilities');
add_action('profile_update''dup_capabilities');
functiondup_capabilities( $user_id){
//在这里设置数据表前缀,不分主站子站,全部写上即可。
$prefixs= array('v7v3cn_','v7v3en_');
global$table_prefix;
$cap_val= get_user_meta( $user_id,$table_prefix.'capabilities',true);
if( !empty( $cap_val) ) {
    foreach( $prefixsas$prefix){
       if( $prefix!= $table_prefix)
         update_user_meta( $user_id,$prefix.'capabilities', $cap_val);
       }
   }
}

用法和上面的代码一样,现在两个站点的用户数据就可以完全互通了。(PS:以上方法只适用于两个wordpress站点装在一个服务器上且共用一个数据的情况下。)

原文地址:https://jingyan.baidu.com/article/48206aeaee8e1d216ad6b3d7.html

给TA打赏
共{{data.count}}人
人已打赏
建站教程

【网站教程】如果网站遭受cc攻击怎么防御呢?

2019-10-24 9:04:44

建站教程

【开心版宝塔面板】【宝塔面板V7.x破解版】宝塔面板最新版一键破解会员脚本

2019-10-31 9:09:13

本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策。若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
⚠️
本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策
若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索