Не разрешать доступ к wp-admin, но разрешить выполнение админовских запросов на интерфейсе?

У меня есть сайт, который требует, чтобы у пользователей был acccount, чтобы использовать его. Я не хочу, чтобы определенные роли пользователя имели доступ к wp-admin. Все изменения учетной записи должны происходить в шаблонах управления учетной записью frontend. Если пользователь пытается получить доступ к wp-admin, я хочу перенаправить их обратно на домашнюю страницу сайта.

function redirect_user(){ //...some code... //Have tried: //if(empty(DOING_AJAX) && $users_role =='somerandomrole') //this works on frontend but allows access to wp-admin //if(is_admin() && $users_role =='somerandomrole') //stops access to wp-admin but then frontend stops working if((is_admin() || !empty(DOING_AJAX)) && $users_role =='somerandomrole') { wp_safe_redirect(home_url()); exit; } } add_action('admin_init', 'redirect_user'); 

Проблема в том, что на нашем сайте есть динамические компоненты, такие как инструмент поиска, который обрабатывает запросы через admin-ajax.php, но из-за логики перенаправляет запрос (т. Е. Нет результатов поиска). Есть ли способ сделать эту работу?

Редактирование: Хорошо, поэтому одно решение, которое, похоже, работает, хотя оно не кажется правильным:

 if($_SERVER['PHP_SELF'] != '/wp-admin/admin-ajax.php' && $users_role =='somerandomrole'){ //...code... } 

Есть ли плохой побочный эффект для этого?

Solutions Collecting From Web of "Не разрешать доступ к wp-admin, но разрешить выполнение админовских запросов на интерфейсе?"

Вам не нужно проверять is_admin потому что функция подключена к admin_init , поэтому is_admin() всегда true в admin_init is_admin() ; что ( is_admin() || !empty(DOING_AJAX) ) всегда проверяется как true . Вам нужно только проверить, не определена ли константа DOING_AJAX или определена ли она, и она false (оба случая не являются запросом AJAX) в сочетании с ролью пользователя. Например, чтобы разрешить AJAX и получить доступ только к роли administrator :

 add_action( 'admin_init', 'redirect_user' ); function redirect_user() { $user = wp_get_current_user(); if( ( !defined('DOING_AJAX') || ! DOING_AJAX ) && ( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) ) { wp_safe_redirect(home_url()); exit; } } 

Кроме того, вы можете рассмотреть возможность проверки возможностей вместо ролей. Например:

 add_action( 'admin_init', 'redirect_user' ); function redirect_user() { if( ( !defined('DOING_AJAX') || ! DOING_AJAX ) && ( ! current_user_can('manage_options') ) ) { wp_safe_redirect(home_url()); exit; } }