根据第一个角色更改第二个角色

时间:2017-01-11 作者:Bexx

大家好,我在这里找到了这个代码片段:

add_action( \'set_user_role\', function( $user_id, $role, $old_roles ) 
{
   // Your code ...

}, 10, 3 );
资料来源:Execute a function when admin changes the user role

并希望对其进行修改,以便可以通过以下方式设置用户角色:

1个用户具有角色“level0”和“customer”->角色“level1”和“vendor”

2用户具有角色“level1”和“vendor”->角色“level0”和“customer”

如果管理员将角色“level0”更改为“level1”,则代码应将第二个角色从“客户”更新为“供应商”,反之亦然。

我尝试了以下代码,但不起作用:

add_action( \'set_user_role\', \'rb_update_user_role\',10,3);
function rb_update_user_role(){

   $user_id = get_current_user_id();
   $user = new WP_User ($user_id);

   if (current_user_is(\'s2member_level0\') && current_user_is(\'vendor\')){

      $user->remove_role(\'vendor\');
      $user->add_role(\'customer\');
   }
   if(current_user_is(\'s2member_level1\') && current_user_is (\'customer\')){

      $user->remove_role(\'customer\');
      $user->add_role(\'vendor\');
   }
}
有没有任何建议或代码片段可以帮助我解决这个问题?还是我需要另一种方法?

编辑:

当用户被激活时,我添加了第二个这样的角色

add_action( \'bp_core_activated_user\', \'add_secondary_role_new\', 10, 1 );


function add_secondary_role_new( $user_id ) {
   global $members_template;

   $user = get_user_by(\'id\', $user_id);

   if (user_can($members_template->member->id,\'s2member_level1\')){
       $user->add_role(\'vendor\');
   }
   else{
       $user->add_role(\'customer\');
   }
}

2 个回复
最合适的回答,由SO网友:Bexx 整理而成

我找到了解决办法。这是:

//Update Roles automatically when Membership Level changes
function rb_update_user_role( $user_id) {
    $user = new WP_User( $user_id );
    $user_meta=get_userdata($user_id);
    $all_role = $user_meta->roles;

    foreach ($all_role as $role_value){
        if ($role_value === \'vendor\'){
           $user->remove_role( \'vendor\' );
        }
        if ($role_value === \'customer\'){
           $user->remove_role( \'customer\' );
        }
        if ($role_value === \'s2member_level1\'){
           $user->remove_role( \'s2member_level1\' );
           $role = \'s2member_level1\';
        }
        if ($role_value === \'subscriber\'){
           $user->remove_role( \'subscriber\' );
           $role = \'subscriber\';
        }
    }
    if ( $role === \'subscriber\' ) {
       unset($new_role);
       $new_role = array($role => 0 ,\'customer\' => 1) ;
       update_user_meta($user_id, \'wp_capabilities\', $new_role);
    } 

    if ($role === \'s2member_level1\'){
       unset($new_role);
       $new_role = array($role => 0,\'vendor\' => 1) ;
       update_user_meta($user_id, \'wp_capabilities\', $new_role);
    } 
}
add_action( \'profile_update\', \'rb_update_user_role\', 99, 1 );

SO网友:TheDeadMedic

由于您正在对当前(已登录)用户进行操作,因此需要在回调中接受参数,以便可以对正在设置角色的用户进行操作:

rb_update_user_role( $user_id, $role ) {
    // error_log( "Setting user $user_id to role $role" );

    if ( $role !== \'s2member_level0\' && $role !== \'s2member_level1\' )
        return;

    $user = new WP_User( $user_id );

    if ( $role === \'s2member_level0\' ) {
        $user->remove_role( \'vendor\' );
        $user->add_role( \'customer\' );
    } else {
        $user->remove_role( \'customer\' );
        $user->add_role( \'vendor\' );
    }
}

add_action( \'set_user_role\', \'rb_update_user_role\', 10, 2 );
注意:您不需要删除任何角色-WP_User::set_role 在触发操作之前,显式删除所有其他角色。