zoukankan      html  css  js  c++  java
  • 黄聪:多个wordpress网站(不同域名)共享用户数据的方法

    WordPress可以自定义用户数据表,这样多个wordpress网站就可以共享用户数据了,有时候这是非常方便的,这些Wordpress站点应该安装在同一个数据库下,数据表前缀各不相同。由于Wordpress的用户数据表(wp_users和wp_usermeta)相对独立(点击这里查看Wordpress数据表关系),我们不用担心共享用户数据后会打乱其它的应用。

    共享用户数据

    更改用户表的方法是编辑站点的wp_config.php,加入如下代码,假设需要更改的站点前缀是wpen_,需要共享的用户表前缀是wp_

    1
    2
    define('CUSTOM_USER_TABLE''wp_users');
    define('CUSTOM_USER_META_TABLE''wp_usermeta');

    例如我要做多语言站点,每个语言都是一个独立的wordpress安装,中文版本作为主站,在主站下安装一个新的wp站点作为英文版本,只共享用户数据,其它的都是独立的,类似multisite但有multisite不具备的优势,毕竟很多插件对multisite的支持不是很好。

    这样更改存在一定问题,wp_usermeta表中存储了用户权限,这个权限的值是以wp前缀开头的,以管理员为例,管理员用户id为1,角色是administrator,则表中就有这样一条记录

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

    如果该用户去登陆共享数据并且以wpen_为前缀的网站(http://youdomain.com/wp-admin),就会被提示
    You do not have sufficient permissions to access this page. (你没有足够的权限访问该页面)

    解决的方法是向数据库插入包含wpen_前缀的数据,即

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

    SQL语句为

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

    这样做仅仅使用户id为1的管理员可以正常登陆这两个网站,如果创建了新的用户,无论是管理员还是普通用户,都会被提示权限不足,除非你一条一条的向数据库里插入数据,并且要注意改变角色。一劳永逸的做法是写一段小代码让这个过程自动完成,代码如下

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

    WordPress 3.5上用这段代码

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

    这段代码放到主题的functions.php中或者做成一个小插件都可以。

    如果注册的用户权限很低,例如是订阅者之类的角色,就没必要这样做了,管理员可以到每个网站单独创建一个,各自管理各自的,也是一种解决方法。

  • 相关阅读:
    bzoj1221
    hdu3377
    bzoj3930
    bzoj3976
    bzoj4237
    fzu1977
    hdu1693
    ural1519
    bzoj1264
    回答自己的提问
  • 原文地址:https://www.cnblogs.com/huangcong/p/8603310.html
Copyright © 2011-2022 走看看