Obtenir le rôle d’un utilisateur WordPress

Mis à jour le :

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.

Écran Comptes > Tous les comptes de l’administration de WordPress (titre Comptes, bouton Ajouter un compte) : au-dessus de la liste, les liens de filtre Tous (5) | Administrateur/administratrice (1) | Éditeur/éditrice (1) | Auteur/autrice (1) | Abonné / abonnée (1) | Aucun rôle (1) ; le tableau, aux colonnes Identifiant, Nom, E-mail, Rôle et Articles, liste cinq comptes de démonstration : claire-m7k2 (Claire Martin, Administrateur/administratrice), julien-moreau (Julien Moreau, Éditeur/éditrice), lea-durand (Léa Durand, Aucun), sophie-bernard (Sophie Bernard, Auteur/autrice) et thomas-petit (Thomas Petit, Abonné / abonnée) ; le menu latéral montre Comptes ouvert sur Tous les comptes.
La colonne Rôle de l’écran Comptes > Tous les comptes

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().

<?php
$user = wp_get_current_user();

if ( $user->exists() ) {
	$role_names = array();
	foreach ( $user->roles as $role ) {
		// Role name as displayed in the admin, translated (e.g. "Editor").
		$role_names[] = translate_user_role( wp_roles()->role_names[ $role ] ?? $role );
	}

	echo esc_html__( 'Username:', 'wpchannel' ) . ' ' . esc_html( $user->user_login ) . '<br />';
	echo esc_html__( 'User roles:', 'wpchannel' ) . ' ' . esc_html( implode( ', ', $role_names ) ) . '<br />';
	// $user->roles is an array: a user can have several roles, or none.
}
?>

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.

/**
 * Returns the translated role names of a user, keyed by role (empty array if none).
 *
 * @param int|WP_User $user User ID or object. Default: the logged-in user.
 * @return string[]
 */
function wpc_get_user_role_names( $user = 0 ) {
	if ( ! $user instanceof WP_User ) {
		$user = $user ? get_userdata( (int) $user ) : wp_get_current_user();
	}

	if ( ! $user || ! $user->exists() ) {
		return array();
	}

	$role_names = array();
	foreach ( $user->roles as $role ) {
		$role_names[ $role ] = translate_user_role( wp_roles()->role_names[ $role ] ?? $role );
	}

	return $role_names;
}

/**
 * [wpc_user_role] shortcode: role(s) of the logged-in user, nothing for visitors.
 */
function wpc_user_role_shortcode() {
	return esc_html( implode( ', ', wpc_get_user_role_names() ) );
}
add_shortcode( 'wpc_user_role', 'wpc_user_role_shortcode' );

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.

Avatar de Aurélien Denis

Protégez votre site WordPress

Vos données sont précieuses,
ne prenez pas le risque de tout perdre.
Confiez-moi votre maintenance !

Ces articles devraient t’intéresser…

6 réponses

  1. Avatar de Jean-Thierry
    Jean-Thierry

    Bonjour

    Moi je cherche comment changer le role directement dans la base de données.
    Merci

  2. Avatar de WaZeR
    WaZeR

    D’accord, je vais essayer ^^
    Bah c’est vrai que niveau php, c’est pas encore tout à fait ça 😀

  3. Avatar de WaZeR
    WaZeR

    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.

    1. Avatar de Aurélien Denis
      Aurélien Denis

      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…

  4. Avatar de spykrew07
    spykrew07

    Plus rapide comme ça non ? http://pastebin.com/H8p7m9mn

    1. Avatar de Mickaël Gris
      Mickaël Gris

      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 !