复制meta_key并更改前缀,然后复制meta_value

时间:2018-03-15 18:32:05

标签: php sql wordpress woocommerce user-roles

重复meta_key _capabilities并将前缀从st_pr59t_capabilities更改为wp_capabilities,然后将meta_value st_pr59t_capabilities复制到wp_capabilities < / p>

Take a look at this image: Phpmyadmin Image Illustration

我正致力于创建将由同一组用户访问的wordpress网站SITE 1(st_pr59t_)和SITE 2(wp_)。

我已成功完成

1)在第1站和第2站之间共享用户和用户META

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

所以一切都很好,直到这里。

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

为此,我尝试了solution offered HERE

function ksu_save_role( $user_id, $role ) {

    $prefix_1 = 'st_pr59t_'; // SITE 1's Table Prefix
    $prefix_2 = 'wp_'; // SITE 2's Table Prefix

    $caps = get_user_meta( $user_id, $prefix_1 . 'capabilities', true );
    $level = get_user_meta( $user_id, $prefix_1 . 'user_level', true );

    if ( $caps ){
        update_user_meta( $user_id, $prefix_2 . 'capabilities', $caps );
    }

    if ( $level ){
        update_user_meta( $user_id, $prefix_2 . 'user_level', $level );
    }
}
add_action( 'set_user_role', 'ksu_save_role', 10, 2 );

当仅为用户分配单个用户角色时,上述解决方案很有效。但是,如果为用户分配了多个用户角色,则它不起作用。我的意思是,它不会同步所有用户角色。

在深入挖掘数据库之后,我明白解决方案在于克隆&#34; meta_value&#34; &#34; st_pr59t_capabilities&#34;到&#34; wp_capabilities&#34;

有没有办法复制整个&#39; meta_value&#39;对于&#39; user_id&#39;来自&#34; st_pr59t__capabilities&#34;到&#34; wp_capabilities&#34;?

Phpmyadmin Image Illustration

如果我们可以复制整个meta_value来自&#34; st_pr59t__capabilities&#34;到&#34; wp_capabilities&#34;然后可以同步分配给用户的所有用户角色。

那么需要对上面提到的代码做些什么改变呢?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用允许克隆用户角色的WPDB方法,这样:

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_user_role钩子...请参阅OP的答案。