Поддержка Проблемы и решения Как запретить вход в аккаунт по роли?

  • Решено ukrainaevents

    (@ukrainaevents)


    Всем привет! Ребят подскажите что не так, мне надо ограничить вход в аккаунт для простых кастомеров (роль), вот такой код:

    
    //вот тут пробую разные варианты, но не работает
    add_filter('authenticate',function($user,$username) {
        if (!is_wp_error($user)) {
            $auth_user=get_user_by('login',$username);
            if ($auth_user &&  !is_user_role_in( array('administrator','dropshipper') )  ) {
                return new WP_Error('authentication_failed', '<p class="message"><b>Личный кабинет отключен. Покупки осуществляются без регистрации.</b></p>');
            }
        }
        return $user;
    },100,2);
    
     
     
    
    ## Проверяет есть ли указанная роль в ролях текущего/указанного пользователя
    ## $roles строка/массив - название роли которую нужно проверить у текущего пользователя
    /*
    // Пример использования
    if( is_user_role_in( array('new_role','new_role2') ))
      
      echo 'Роль текущего пользователя new_role или new_role2';
    */
    function is_user_role_in( $roles, $user = false ){
      if( ! $user )           $user = wp_get_current_user();
      if( is_numeric($user) ) $user = get_userdata( $user );
    
      if( empty($user->ID) )
        return false;
    
      foreach( (array) $roles as $role )
        if( isset($user->caps[ $role ]) || in_array($role, $user->roles) )
          return true;
    
      return false;
    }
    
    
Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Автор ukrainaevents

    (@ukrainaevents)

    вот так:

    
    add_filter('authenticate','filter_function_name_4601',10,3);
    function filter_function_name_4601($user,$username,$password){
      if($username){
      if(isset($username)){$user=get_user_by('login',$username);$user_data=get_object_vars($user);}	
      if(isset($user_data)){$userId=$user_data["ID"];$u_meta=get_userdata($userId);$u_roles=$u_meta->roles;}
      }	
      if(!empty($u_roles)&&(in_array('administrator',$u_roles,true)||in_array('editor',$u_roles,true))){//перебираем роли. которые хотим запретить
      $Who=in_array('administrator',$u_roles,true)?__('Администраторам','VAB'):__('Редакторам','VAB');
      wp_die($Who.' '.__('авторизация запрещена','VAB'));//пишем месседж для них
      }else{
      return $user;
      }
    }
    

    Можно гораздо проще:

    add_filter('authenticate','filter_function_name_4601',10,3);
    function filter_function_name_4601($user, $username, $password){
    
    	if($username){
    		if(isset($username)) $user = get_user_by('email',$username);
    		
    		if(isset($user) && is_object($user) && in_array('organization_not_confirmed', $user->roles) )//перебираем роли. которые хотим запретить
    			wp_die('Авторизация запрещена'); //пишем месседж для них
    	}
    
    	return $user;
    }
Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Тема «Как запретить вход в аккаунт по роли?» закрыта для новых ответов.