Un utilisateur WordPress est en principe associé à un rôle (abonné, contributeur, auteur, éditeur ou administrateur) auquel sont associées des capacités (publier un contenu, modifier les réglages, etc.). Un compte peut toutefois n’avoir aucun rôle sur un site, ou en cumuler plusieurs.
Pour simplement connaître le rôle d’un utilisateur, nul besoin de code : rendez-vous dans Comptes > Tous les comptes, où la colonne Rôle l’indique pour chaque compte (Aucun pour un compte sans rôle). Les liens placés au-dessus de la liste filtrent les comptes par rôle.
Si vous souhaitez afficher sur votre site le rôle d’un utilisateur, quelques lignes de code seront nécessaires.
Pour obtenir le rôle de l’utilisateur connecté, insérez ces quelques lignes là où l’information doit être affichée, dans un fichier de modèle de votre thème classique, de préférence dans un thème enfant. Vous pouvez également passer par une fonction PHP si vous comptez réutiliser ce code plusieurs fois : c’est l’objet de la partie suivante, qui convient aussi aux thèmes à blocs.
Le code fait la chose suivante : la fonction wp_get_current_user() récupère l’utilisateur connecté, dont la propriété roles contient les identifiants de ses rôles (subscriber, editor…). La fonction translate_user_role() donne ensuite le nom traduit de chaque rôle, tel qu’il s’affiche dans l’administration (« Éditeur/éditrice » en français, par exemple). Enfin, la fonction echo affiche l’identifiant de l’utilisateur et son ou ses rôles, échappés par esc_html().
Les libellés Username: et User roles: passent par la fonction de traduction esc_html__() : remplacez le domaine wpchannel par celui de votre thème, ou saisissez directement des libellés en français.
Libre à vous d’adapter ce code afin de remonter d’autres informations sur l’utilisateur connecté.
Une fonction réutilisable et un code court
Pour réutiliser ce code, ou pour connaître le rôle d’un autre utilisateur, placez plutôt la fonction suivante dans le fichier functions.php d’un thème enfant ou dans un plugin de fonctions globales. Elle crée aussi le code court [wpc_user_role], qui affiche le ou les rôles de l’utilisateur connecté, et rien pour un visiteur. C’est la solution avec un thème à blocs, dont les modèles n’exécutent pas de PHP : insérez ce code court dans une page ou un modèle avec le bloc Code court.
Appelée sans argument, la fonction wpc_get_user_role_names() renvoie les rôles de l’utilisateur connecté ; avec un identifiant ou un objet WP_User, ceux de n’importe quel utilisateur. Par exemple, wpc_get_user_role_names( 42 ) renvoie array( 'editor' => 'Éditeur/éditrice' ) si le compte n°42 est éditeur. Le tableau est vide pour un visiteur non connecté, un compte sans rôle ou un identifiant inconnu.
Pour tester un rôle précis, comparez son identifiant plutôt que son nom traduit : in_array( 'editor', wp_get_current_user()->roles, true ) vaut true si l’utilisateur connecté est éditeur. Et pour autoriser ou non une action, testez une capacité plutôt qu’un rôle, par exemple avec current_user_can( 'edit_others_posts' ) : la documentation de current_user_can() déconseille de lui passer un rôle à la place d’une capacité, le résultat pouvant être peu fiable.
Pour ajuster les capacités d’un rôle, voyez comment autoriser les contributeurs à envoyer des fichiers.
6 réponses
Bonjour
Moi je cherche comment changer le role directement dans la base de données.
Merci
D’accord, je vais essayer ^^
Bah c’est vrai que niveau php, c’est pas encore tout à fait ça 😀
Bonjour, merci pour le tuto 🙂
Je vais paraître un peu chiant ^^ mais je ne sais pas où mettre le code pour afficher le role à côté du pseudo, dans mon « comments.php »
Si vous savez, merci de m’aider 😀
Je peux voir partager mon fichier si ça peut aider.
Hello,
il faut identifier la fonction qui modifie l’affichage de tes commentaires. Généralement, un callback dans comments.php est défini et renvoie au fichier functions.php de ton thème. En faisant une recherche sur les avatars, tu devrais parvenir à identifier cette boucle et donc à placer le code au bon endroit. Pas évident je te l’accorde…
Plus rapide comme ça non ? http://pastebin.com/H8p7m9mn
Hello,
Effectivement, j’ai testé en front ça marche et c’est plus court 🙂 .
Par contre, il me semble que dans certains cas la variable « $current_user » n’est pas définie, et donc ne retourne rien ! C’est notamment le cas dans les mu-plugins.
Du coup, en partant de la fonction get_userdata(); on est sûr que ça fonctionne dans tous les cas !