Zugriff auf wp-admin nicht zulassen, aber Admin-ajax-Anfragen am Frontend zulassen?

Ich habe eine Website, die Benutzer benötigt, um sie verwenden zu können. Ich möchte nicht, dass bestimmte Benutzerrollen auf wp-admin zugreifen können. Alle Kontoänderungen sollten in den Frontend Account Management Templates erfolgen. Wenn ein Benutzer versucht, auf wp-admin zuzugreifen, möchte ich ihn auf die Homepage der Website zurückleiten.

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

Das Problem, das ich habe, ist, dass es dynamische Komponenten auf unserer Seite gibt, wie ein Suchwerkzeug, das Anfragen über admin-ajax.php absetzt, aber aufgrund der Logik die Anfrage umleitet (dh keine Suchergebnisse). Gibt es eine Möglichkeit, dies zum functionieren zu bringen?

Edit: Ok, eine Lösung, die scheinbar funktioniert, obwohl sie sich nicht richtig anfühlt:

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

Gibt es eine schlechte Nebenwirkung, es auf diese Weise zu tun?

Solutions Collecting From Web of "Zugriff auf wp-admin nicht zulassen, aber Admin-ajax-Anfragen am Frontend zulassen?"

Sie müssen is_admin nicht überprüfen, da die function mit admin_init , so dass is_admin() im Callback immer true . das macht das ( is_admin() || !empty(DOING_AJAX) ) immer als true . Sie müssen nur prüfen, ob die Konstante DOING_AJAX nicht definiert ist oder ob sie definiert und false (beide Fälle sind keine AJAX-Anfrage), kombiniert mit der Benutzerrolle. Um beispielsweise AJAX zuzulassen und nur auf die administrator zuzugreifen:

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

Außerdem können Sie prüfen, ob functionen anstelle von Rollen überprüft werden. Beispielsweise:

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