sputnickk
@sputnickk

Как запретить вход в аккаунт по роли?

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

//вот тут пробую разные варианты, но не работает
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;
}
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
V_A_B
@V_A_B
¯\_(ツ)_/¯
add_filter('authenticate','filter_function_name_4601');
function filter_function_name_4601($user){
	if(isset($_POST['log'])){
	$username=$_POST['log'];
	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;
	}
}

Результат, смотря кто ломится
5e9849612ddb8834465415.jpeg
5e9849ed43f95972809011.jpeg

через username
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;
	}
}

это, если разрабы завтра log поменяют на что-то другое...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
aveyda7
@aveyda7
Photoshop
Вариант первый: с помощью плагина Remove Dashboard Access. Скачать его можно здесь: https://wordpress.org/plugins/remove-dashboard-acc...

Вариант второй: Добавьте следующий код в файл functions.php Вашей активной темы. Вместо administrator вставляете нужную вам роль. Пользователь попытавшийся зайти в админ панель Wordpress получит сообщение о 404 ошибке.

function true_wp_admin_block() {
	if (!current_user_can('administrator')) { // если не администратор
		header('HTTP/1.0 404 Not Found');
		exit();
	}	
}
add_action('admin_menu', 'true_wp_admin_block');


В WordPress по умолчанию уже существует 6 групп пользователей:

  1. Super Admin — суперадминистратор, который имеет право управлять сетью сайтов.
  2. Administrator — администратор.
  3. Editor — редактор, может публиковать и редактировать посты других пользователей.
  4. Author — автор, может публиковать и редактировать собственные посты.
  5. Contributor — участник, может писать и отправлять свои посты на модерацию.
  6. Subscriber — подписчик, всё, что он может — это редактировать свой профиль.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы