Não permita o access ao wp-admin, mas permite que os pedidos do admin-ajax sejam cumpridos no frontend?

Eu tenho um site que exige que os usuários tenham uma conta para usá-lo. Não quero que determinadas funções de usuários tenham access ao wp-admin. Todas as alterações da conta devem ocorrer nos modelos de gerenciamento de conta frontend. Se um usuário tentar acessar o wp-admin, quero redirecioná-los de volta para a página inicial do site.

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

O problema que tenho é que existem componentes dynamics para o nosso site, como uma ferramenta de pesquisa que faz pedidos via admin-ajax.php, mas devido à lógica redireciona a solicitação (ou seja, não há resultados de pesquisa). Existe uma maneira de fazer isso funcionar?

Edit: Ok, então uma solução que parece funcionar, embora não se sinta certa é:

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

Existe um efeito colateral ruim para fazê-lo dessa maneira?

Solutions Collecting From Web of "Não permita o access ao wp-admin, mas permite que os pedidos do admin-ajax sejam cumpridos no frontend?"

Você não precisa verificar is_admin porque a function está conectada a admin_init , então is_admin() sempre é true no retorno de chamada; Isso faz que ( is_admin() || !empty(DOING_AJAX) ) sempre verifique como true . Você só precisa verificar se a constante DOING_AJAX não está definida ou se ela está definida e é false (ambos os casos não são uma solicitação AJAX), combinados com a function do usuário. Por exemplo, para permitir AJAX e acessar apenas a function de 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; } } 

Além disso, você pode considerar verificar as capacidades em vez das funções. Por exemplo:

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