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 ) );
}
}