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

Posted

技术标签:

【中文标题】复制 meta_key 并更改前缀,然后复制 meta_value [重复]【英文标题】:Duplicate meta_key and change prefix and then copy meta_value [duplicate] 【发布时间】: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”,那么分配给用户的所有用户角色都可以同步。

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

【问题讨论】:

【参考方案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->prefixusermeta
        WHERE meta_key = '$prefix1capabilities' AND user_id = %d
    ", $user_id ) );

    if( $caps ) 
        $wpdb->query( $wpdb->prepare( "
            UPDATE $wpdb->prefixusermeta as um SET meta_value = '%s'
            WHERE um.user_id = %d AND um.meta_key = '$prefix2capabilities'
        ", $caps, $user_id ) );
    

代码进入您的活动子主题(或活动主题)的 function.php 文件中。测试和工作。它也应该适合你……

编辑:正确的方法似乎是使用 add_user_role 钩子来代替......请参阅 OP 的答案。

【讨论】:

感谢您为帮助 @LoicTheAztec 所做的努力。当我尝试设置(更改)单个用户角色时,您的解决方案有效。但是当我尝试更改多个用户角色时,它不起作用。我已经发布了我的问题的解决方案。请看一下。谢谢! @ManjuTalluri 这只是关于钩子......非常有趣! …我也赞成你的回答…

以上是关于复制 meta_key 并更改前缀,然后复制 meta_value [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何停止 System.Threading.Timer,然后更改其参数并再次运行? [复制]

如何根据用户角色(尤其是可变产品)显示不同的产品价格? [复制]

如何更改图像源,在 GUI 中显示并在之后运行一些代码? [复制]

为啥将迭代器作为参数传递并在尾部位置递归时后缀失败并且前缀工作正常? [复制]

复制目录中的文件并更改文件名

如何获得支持所有设备的 J2ME 的 IMEI? [复制]