it-swarm.com.de

Zugriff auf wp-admin nicht zulassen, aber zulassen, dass admin-ajax-Anforderungen am Frontend erfüllt werden?

Ich habe eine Website, für die Benutzer ein Konto benötigen, um sie zu verwenden. Ich möchte nicht, dass bestimmte Benutzerrollen Zugriff auf wp-admin haben. Alle Kontoänderungen sollten in den Vorlagen für die Frontend-Kontoverwaltung erfolgen. Wenn ein Benutzer versucht, auf wp-admin zuzugreifen, möchte ich ihn zurück zur Homepage der Site leiten.

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 Website gibt, wie z. B. ein Suchwerkzeug, das Anfragen über admin-ajax.php stellt, die Anfrage jedoch aufgrund der Logik umleitet (d. H. Keine Suchergebnisse). Gibt es eine Möglichkeit, diese Arbeit zu machen?

Bearbeiten: Ok Eine Lösung, die anscheinend funktioniert, obwohl sie sich nicht richtig anfühlt, ist:

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

Gibt es einen schlechten Nebeneffekt, wenn man es so macht?

2
Shawn

Sie müssen is_admin nicht überprüfen, da die Funktion mit admin_init verknüpft ist. Daher ist is_admin() im Rückruf immer true. das macht, dass ( is_admin() || !empty(DOING_AJAX) ) immer als true verifiziert wird. Sie müssen nur überprüfen, ob die Konstante DOING_AJAX nicht definiert ist oder ob sie definiert ist und es sich um false handelt (beide Fälle sind keine AJAX -Anforderung), kombiniert mit der Benutzerrolle. Zum Beispiel, um AJAX zuzulassen und nur auf die Rolle 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;
    }

}

Sie können auch in Betracht ziehen, Funktionen anstelle von Rollen zu überprüfen. Zum Beispiel:

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

}
2
cybmeta