【问题标题】:Duplicate meta_key and change prefix and then copy meta_value [duplicate]复制 meta_key 并更改前缀,然后复制 meta_value [重复]
【发布时间】:2018-08-24 16:46:04
【问题描述】:

复制meta_key_capabilities并将前缀从st_pr59t_capabilities更改为wp_capabilities,然后将st_pr59t_capabilities中的meta_value复制为wp_capabilities

Take a look at this image: Phpmyadmin Image Illustration

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

我已经成功完成

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

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

到目前为止一切都很好。

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

为此我尝试了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 );

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

通过数据库挖掘后,我了解到解决方案在于将“st_pr59t_capabilities”的“meta_value”克隆为“wp_capabilities

有没有办法将“user_id”的整个“meta_value”从“st_pr59t__capabilities”复制到“wp_capabilities”?

Phpmyadmin Image Illustration

如果我们可以将整个meta_value从“st_pr59t__capabilities”复制到“wp_capabilities”,那么分配给用户的所有用户角色都可以同步。

那么需要对上面提到的代码做哪些修改来实现呢?

【问题讨论】:

    标签: php sql wordpress woocommerce user-roles


    【解决方案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 的答案。

    【讨论】:

    • 感谢您为帮助 @LoicTheAztec 所做的努力。当我尝试设置(更改)单个用户角色时,您的解决方案有效。但是当我尝试更改多个用户角色时,它不起作用。我已经发布了我的问题的解决方案。请看一下。谢谢!
    • @ManjuTalluri 这只是关于钩子......非常有趣! …我也赞成你的回答…
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2012-10-03
    • 2015-03-03
    相关资源
    最近更新 更多