Php 复制meta_键并更改前缀,然后复制meta_值

Php 复制meta_键并更改前缀,然后复制meta_值,php,sql,wordpress,woocommerce,user-roles,Php,Sql,Wordpress,Woocommerce,User Roles,复制meta_键

复制
meta_键
并将前缀从
st_pr59t_能力
更改为
wp_能力
,然后将
st_pr59t_能力
meta_值
复制到
wp_能力

我正致力于创建wordpress站点1(
st_pr59t_
)和站点2(
wp_
),供同一组用户访问

我已经成功地完成了

1) 在站点1和站点2之间共享用户和用户元

2) 在站点1和站点2之间共享登录cookie

所以在这里之前一切都很好

现在,我不仅要同步用户,还要同步所有用户的用户角色(多个用户角色)

为此,我尝试了以下方法:

当只有一个用户角色被分配给一个用户时,上述解决方案非常有效。但是如果一个用户被分配了多个用户角色,那么它就不起作用了。我的意思是,它不会同步所有用户角色

在对数据库进行深入研究后,我了解到解决方案在于将“
st\u pr59t\u功能
”的“
meta\u值
”克隆为“
wp\u功能

是否有办法将“
用户id
”的整个“
元值”从“
st\u pr59t\u功能”复制到“
wp\u功能”

如果我们可以将整个
meta_值
从“
st_pr59t__能力
”复制到“
wp_能力
”,则可以同步分配给用户的所有用户角色

因此,需要对上述代码进行哪些更改才能实现这一点?

您可以尝试使用允许克隆用户角色的方法,方法如下:

add_action( 'set_user_role', 'ksu_save_role', 10, 2 );
function ksu_save_role( $user_id, $role ) {
    global $wpdb;

    $prefix1 = 'st_pr59t_';
    $prefix2 = 'wp_';

    ## --- USER LEVEL --- ##

    $level = get_user_meta( $user_id, $prefix1 . 'user_level', true );
    if( $level ) {
        update_user_meta( $user_id, $prefix2 . 'user_level', $level );
    }

    ## --- USER ROLES --- ##

    $caps = $wpdb->get_var( $wpdb->prepare( "
        SELECT meta_value FROM {$wpdb->prefix}usermeta
        WHERE meta_key = '{$prefix1}capabilities' AND user_id = %d
    ", $user_id ) );

    if( $caps ) {
        $wpdb->query( $wpdb->prepare( "
            UPDATE {$wpdb->prefix}usermeta as um SET meta_value = '%s'
            WHERE um.user_id = %d AND um.meta_key = '{$prefix2}capabilities'
        ", $caps, $user_id ) );
    }
}
代码进入活动子主题(或活动主题)的function.php文件。测试和工作。它也应该对你有用

编辑:正确的方法似乎是使用
add\u user\u role
hook…请参见OP的答案


我感谢你为帮助@LoicTheAztec所做的努力。当我尝试设置(更改)单个用户角色时,您的解决方案有效。但是,当我尝试更改多个用户角色时,它不起作用。我已经发布了我问题的解决方案。请看一看。谢谢@ManjuTalluri这只是关于钩子…非常有趣…我也投票支持你的答案…
add_action( 'set_user_role', 'ksu_save_role', 10, 2 );
function ksu_save_role( $user_id, $role ) {
    global $wpdb;

    $prefix1 = 'st_pr59t_';
    $prefix2 = 'wp_';

    ## --- USER LEVEL --- ##

    $level = get_user_meta( $user_id, $prefix1 . 'user_level', true );
    if( $level ) {
        update_user_meta( $user_id, $prefix2 . 'user_level', $level );
    }

    ## --- USER ROLES --- ##

    $caps = $wpdb->get_var( $wpdb->prepare( "
        SELECT meta_value FROM {$wpdb->prefix}usermeta
        WHERE meta_key = '{$prefix1}capabilities' AND user_id = %d
    ", $user_id ) );

    if( $caps ) {
        $wpdb->query( $wpdb->prepare( "
            UPDATE {$wpdb->prefix}usermeta as um SET meta_value = '%s'
            WHERE um.user_id = %d AND um.meta_key = '{$prefix2}capabilities'
        ", $caps, $user_id ) );
    }
}