web-dev-qa-db-fra.com

N'autorisez pas l'accès à wp-admin, mais autorisez les requêtes admin-ajax à se réaliser sur le front-end?

J'ai un site qui oblige les utilisateurs à avoir un compte pour l'utiliser. Je ne veux pas que certains rôles d'utilisateur aient accès à wp-admin. Toutes les modifications de compte doivent avoir lieu sur les modèles de gestion de compte frontend. Si un utilisateur tente d'accéder à wp-admin, je souhaite les rediriger vers la page d'accueil du 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');

Le problème que j'ai est qu'il y a des composants dynamiques sur notre site, comme un outil de recherche qui fait des demandes via admin-ajax.php mais en raison de la logique, redirige la demande (c'est-à-dire, aucun résultat de recherche). Y at-il un moyen de faire ce travail?

Edit: Ok donc une solution qui semble fonctionner même si elle ne semble pas appropriée est la suivante:

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

Y at-il un mauvais effet secondaire à le faire de cette façon?

2
Shawn

Vous n'avez pas besoin de vérifier is_admin car la fonction est liée à admin_init, donc is_admin() est toujours true dans le rappel; cela fait que ( is_admin() || !empty(DOING_AJAX) ) vérifie toujours que true. Il vous suffit de vérifier si la constante DOING_AJAX n'est pas définie ou si elle est définie sur false (les deux cas ne sont pas une demande AJAX), combinés avec le rôle d'utilisateur. Par exemple, pour autoriser AJAX et accéder uniquement au rôle 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;
    }

}

En outre, vous pouvez envisager de vérifier les capacités plutôt que les rôles. Par exemple:

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