Comment restreindre l'accès au tableau de bord aux administrateurs uniquement?

19

Comment restreindrions-nous l'accès à la zone d'administration de WP à tous les utilisateurs à l'exception des administrateurs?
Les utilisateurs de notre site ont leurs propres pages de profil qui font toutes les fonctions dont ils ont besoin.

L'administrateur doit donc être interdit à tous sauf aux administrateurs.

Comment faire ça?

Robin I Knight
la source
Vous voulez dire qu'il y a des pages utilisateur «frontales» qui ne nécessitent pas d'accéder à quoi que ce soit situé sur votredomaine.com/wp-admin ?
curtismchale
Oui, exactement. Y-a-t-il un problème avec cela?
Robin I Knight
Non, juste pour clarifier.
Curtismchale

Réponses:

19

Nous pouvons nous accrocher à l' admin_initaction et vérifier si l'utilisateur est un administrateur en utilisant la current_user_can()fonction pour voir si l'utilisateur actuel le peut manage_options, ce que seul un administrateur peut faire.

Ce code, une fois collé dans votre fichier functions.php, affichera un message lorsqu'un non-administrateur essaie d'accéder au tableau de bord:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( __( 'You are not allowed to access this part of the site' ) );
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

Si vous préférez, vous pouvez offrir une meilleure expérience utilisateur en redirigeant l'utilisateur vers la page d'accueil à la place:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_redirect( home_url() );
        exit;
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

Si vous souhaitez rediriger l'utilisateur vers sa page de profil, remplacez home_url()le code ci-dessus par le lien.

karité
la source
Cette réponse ne répond pas aux exigences de la question. Tout d'abord, vous désactivez l'accès à la zone d'administration à un utilisateur doté de la fonction "manage_options" et une capacité peut être affectée à plusieurs rôles, pas seulement à l'administrateur. De plus, la fonction "manage_options" peut être supprimée de l'administrateur.
cybmeta
@cybmeta vérifier la manage_optionscapacité est le moyen accepté pour vérifier un utilisateur administrateur. Même Mark Jaquith le dit
shea
L'interrogateur a demandé exactement la vérification du rôle d'utilisateur administrateur et je pense qu'il est important de lui donner la réponse exacte et d'expliquer quand et pourquoi la vérification de la capacité peut être meilleure. Vous dites manage_optionsque quelque chose que seuls les «administrateurs» peuvent faire et que ce n'est pas vrai, manage_optionsest une capacité et peut être supprimé du rôle d'administrateur ou attribué à d'autres rôles d'utilisateur. L'important est de savoir ce que vous voulez faire et de choisir la meilleure façon. Voir ma réponse, je l'explique.
cybmeta
Vous monsieur, obtenez un +1! :) Je cherche ça depuis des heures! Aussi une petite amélioration. Site unique votre chèque est suffisant. Pour les sites multiples que vous souhaitez remplacer manage_optionspar manage_network. Ce dernier désactiverait également le tableau de bord pour les «administrateurs de site» par défaut, mais laisserait l'accès disponible aux super administrateurs (administrateurs réseau).
rkeet
Le principal problème avec cette réponse est qu'elle se heurte aux appels ajax. @cybmeta a la bonne réponse ci-dessous.
RiotAct
9

Certaines des réponses données peuvent être correctes dans la plupart des situations, mais je pense qu'aucune d'entre elles ne garantit de faire exactement ce qui est demandé car aucune des réponses ne vérifie les rôles des utilisateurs, elles vérifient que les capacités et les capacités peuvent être attribuées et supprimées des rôles de formulaire. Donc, pour donner une réponse exacte, les rôles d'utilisateur doivent être vérifiés, pas les capacités:

add_action( 'admin_init', 'allow_admin_area_to_admins_only');
function allow_admin_area_to_admins_only() {

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Allow ajax calls
            return;
      }

      $user = wp_get_current_user();

      if( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) {
           //Redirect to main page if no user or if the user has no "administrator" role assigned
           wp_redirect( get_site_url( ) );
           exit();
      }

 }

Si vous voulez vérifier que l'utilisateur a la capacité "manage_options", vous pouvez. En fait, c'est la meilleure option dans la plupart des cas. Bien que cette fonctionnalité soit associée par défaut aux utilisateurs administrateurs, elle peut être supprimée du rôle d'administrateur ou affectée à d'autres rôles d'utilisateur. C'est pourquoi, dans la plupart des cas, il est préférable de vérifier ce que l'utilisateur peut ou ne peut pas faire que de vérifier le rôle de l'utilisateur. Donc, dans la plupart des cas, la vérification des capacités doit être la méthode choisie, mais vous devez avoir ce concept clair et choisir la meilleure option pour votre situation et votre objectif:

add_action( 'admin_init', 'admin_area_for_manage_options_only');
function admin_area_for_manage_options_only() {

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Allow ajax calls
            return;
      }


      if( ! current_user_can( "manage_options" ) ) {
           //Redirect to main page if the user has no "manage_options" capability
           wp_redirect( get_site_url( ) );
           exit();
      }

 }
cybmeta
la source
Ceci est la bonne réponse. Il ne se heurte pas aux appels ajax.
RiotAct
3

Essayez le plugin Adminimize .
Vous pouvez très bien verrouiller les choses avec ça.

Vous pouvez également essayer de configurer l'accès via le fichier htaccess

goofydg1
la source
1
+1 pour Adminimize. C'est la bête d'un plugin. Couplé avec un plugin de gestionnaire de rôles personnalisé, il bascule simplement. (Si je suis excusé une opinion personnelle) :::: Comme dernière note: veuillez donner plus d'informations que des liens, cela rend la réponse plus complète.
brasofilo
2
function wpse_11244_restrict_admin() {
    if (!current_user_can('update_core')) {
        wp_die(__('You are not allowed to access this part of the site'));
    }
}

add_action('admin_init', 'wpse_11244_restrict_admin', 1);
Gabi
la source
4
'administrator'n'est pas une capacité. Cela fonctionne juste pour maintenir la compatibilité descendante. Vérifiez 'update_core'ou d'autres capacités d'administration.
fuxia
En outre, des capacités peuvent être attribuées à des rôles, donc si vous souhaitez autoriser l'accès à l'utilisateur "administrateur", vous devez vérifier les rôles, pas les capacités.
cybmeta
0

Mettez ces lignes dans votre functions.php

function baw_no_admin_access()
{
 if( !current_user_can( 'administrator' ) ) {
     wp_redirect( home_url() );
     die();
  }
}
add_action( 'admin_init', 'baw_no_admin_access', 1 );
Junaid Munir
la source
3
comme @toscho a dit 'administrateur' n'est pas une capacité, utilisez plutôt des capacités d'administration comme 'update_core'
Pierre
0

Essayez ceci, jamais par des erreurs face à un utilisateur final. Contre un bon UX. Ce code les redirige vers Home.

    add_action( 'init', 'blockusers_init' );
function blockusers_init() {
if ( is_admin() && ! current_user_can( 'administrator' ) &&
! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
wp_redirect( home_url() );
exit;
}
}
Ahmad Awais
la source
-1

J'utiliserais WP Frontend et le définirais pour tout le monde, attendez-vous aux administrateurs.

Benny
la source
Veuillez fournir plus d'informations puis un lien - cela rend la réponse plus complète
karité