Tout savoir sur WordPress
Tutoriel WordPress

Restreindre l’accès de l’administration à certains rôles

Cette astuce permet de restreindre l’accès à l’administration de WordPress en fonction du rôle de l’utilisateur.

L’administration de WordPress est un endroit réservé à certaines tâches bien spécifiques. De plus, n’importe quel membre de votre site peut s’y rendre une fois connecté.

Mais comment faire pour restreindre l’accès de votre administration selon le rôle de l’utilisateur ?

Par exemple, les membres avec le rôle « abonné » ont uniquement accès à l’édition de leur profil. Si votre site ne propose pas de fiche membre, l’édition de leurs informations personnelles est totalement inutile. C’est à ce moment là que notre astuce intervient !

Copier le code ci-dessous dans le fichier functions.php de votre thème pour restreindre l’accès aux abonnés :

add_action('admin_init', 'gkp_restrict_access_administration');	
function gkp_restrict_access_administration(){
    if ( current_user_can('subscriber') ) {
        wp_redirect( get_bloginfo('url') );
	exit();
    }
}

Autre exemple, l’accès à l’administration de WordPress est autorisé pour les membres ayant le rôle d’administrateur ou d’éditeur :

add_action('admin_init', 'gkp_restrict_access_administration');	
function gkp_restrict_access_administration(){
    if (!current_user_can('administrator') && !current_user_can('editor')) {
	wp_redirect( get_bloginfo('url') );
	exit();
    }
}
Cet article a été mis à jour il y a 2277 jours - Il n'est peut être plus à jour !

Article écrit par Jonathan B.

Jonathan est le co-fondateur de WP Media, startup connue pour être l’auteur de WP Rocket et Imagify. Il est aussi co-organisateur du WordCamp Lyon et Paris.

28 Commentaires

  1. Hello,
    Je sais que ca n’a pas vraiment de rapport, mais je cherche un plugin ou bout de code pour restreindre l’acces au contenu du site à des personnes enregistrées.
    une idée?

  2. Bonsoir Jonathan,

    Pourrais-tu me dire à quel niveau faut-il insérer le code pour restreindre l’accès aux abonnés ? Je l’ai inséré à la fin mais cela ne fonctionne pas..

  3. j’ai ce message : fatal error : Call to undefined function add_action() in/

    quand vous dite à la racine, cela veut dire www ? désolé je suis débutant

  4. Non, à la « racine du thème » et non pas à la racine du projet. Vous n’avez pas insérer le code dans le bon fichier et il ne doit très certainement pas s’appeler functions.php.

    Ce fichier se trouve dans le dossier de votre thème qui est situé dans /wp-content/themes/nom-du-theme/

  5. Bonjour Jonathan,

    je me demandais dans quelle mesure il serait possible de modifier ce bout de code afin qu’il ne bloque pas l’upload de fichiers via le frontend ?

    Merci d’avance

  6. @ Charlotte: Ce code n’a rien à voir avec la partie frontend. Il concerne uniquement la partie administration.

  7. @Jonathan,

    oui je sais, mais j’ai un formulaire en frontend qui permet l’upload de photos et qui utilise les fichiers media-upload.php (et il me semble admin-ajax.php, et async-upload.php). Du coup ces fichiers sont bloqués par le script et je voulais savoir comment on pouvait créer une exception ?

    Merci

  8. Bonjour,
    comment se fait-il que ce code ne fonctionne que dans le fichier original du thème, et non le thème enfant (enfin d’après mes essais) car prochaine mise à jour. Si j’oublie, je vais pas trop être à la fête.

    Sinon, je râle, mais ça vient de m’enlever une sacré épine du pied. Merci ;)

  9. Hello !

    Je suis dans le même cas que Charlotte. J’ai besoin de cette fonction pour désactiver la partie admin pour les membres mais j’ai également besoin d’AJAX !
    Et qui dit ajax en wordpress = appel du fichier admin-ajax.

    Doit bien y avoir une petite solution ? :)

    Merci en tout cas pour ce bout de code très utile.

  10. Pour utiliser ce code tout en permettant l’upload de fichier dans la partie frontend avec la fonction ajax de WordPress il faut faire ceci :

    ————

    add_action(‘admin_init’, ‘gkp_restrict_access_administration’);
    // On vérifie si c’est une requête Ajax
    function is_ajax(){
    return (defined(‘DOING_AJAX’) && DOING_AJAX);
    }
    function gkp_restrict_access_administration()()
    {
    // Bloque le panneau d’administration
    // SAUF Si l’utilisateur a besoin d’accéder aux fonctions wordpress admin avec une requête ajax
    if(!current_user_can(‘votre_capabilité’) && !is_ajax()){
    wp_redirect(home_url());
    exit;
    }
    }

    ————
    Ainsi, la fonction vérifie si il y a ou non la capabilité néccéssaire pour acceder à l’admin ET s’il y a une requête ajax. Dans mon exemple j’ai pris l’exemple à l’envers : S’il n’a pas la capabilité ET que ce n’est pas une requête AJAX je redirige vers l’accueil du site. Dans tous les autres cas possibles :

    -> donc soit l’utilisateur a la capabilité mais ce n’est pas une requête ajax = on permet l’accès à l’admin
    OU
    -> soit l’utilisateur n’a pas la capabilité mais c’est une requête ajax = on permet l’accès à l’admin

    Tout en bloquant l’admin on peut donc par exemple continuer à utiliser le fichier admin-ajax.php et conserver la fonction d’upload en utilisant sur le frontend les fonctions faisant partie intégrante de la zone admin de wordpress.

  11. Bonjour Jonathan,

    Top cet article !! J’ai essayé et ça marche bien.

    Mais maintenant j’ai un problème. j’ai installé le plugin S2 member pour avoir un espace personnalisé, et j’ai donc remplacé ‘subscriber’ par le level correspondant : ‘s2Member Level 1’ mais ça ne fonctionne pas…

    Est-ce que tu aurais une idée ?

    Merci !

  12. Salut. Sur un site Buddypress, les utilisateurs (abonnés) peuvent modifier leur profil directement sur le site. Je voudrais les empêcher d’accéder à wp-admin après inscription et connexion, donc les rediriger directement vers leurs profils.
    Merci.

  13. Hello,

    Merci pour l’astuce.
    Cependant, j’utilise un plugin qui me permet de créer des nouveaux utilisateurs en front-end.
    Ce code bloque le plugin sur une page blanche une fois le nouvel utilisateur inscrit.

    Une idée pour laisser la partie front-end accessible mais pas le http://www.mondomaine.com/wp-admin?

    Merci

  14. Bonjour à tous,

    Au cas où cela pourrait aider certain d’entre vous, voici comment j’ai autorisé Ajax à passer malgré le filtre :

    if (!current_user_can(‘administrator’) && ( !isset($_SERVER[‘HTTP_X_REQUESTED_WITH’]) || $_SERVER[‘HTTP_X_REQUESTED_WITH’] != ‘XMLHttpRequest’ ) ) {
    wp_redirect(get_option(‘siteurl’));
    }

    Deux des plugins que j’utilise (Front End Editor 2.3.1 de Scribu et WP-PostRatings 1.8.1 de Lester Chan) utilisent certains scripts php de l’admin et étaient bloqués.

    Avec ce calibrage, plus de problème de mon côté.

    François

  15. Sinon pour « rester » sur la page en cours (revenir sur la page précédente en réalité, mais pour l’utilisateur c’est transparent), plutôt que de revenir sur la page d’accueil :
    wp_redirect( $_SERVER[‘HTTP_REFERER’] );

a07eb7b566d9eb3e2e85542c4a0eb3b8]]]]]]]]]]]]]]]]]]]]]]]]]]]]]