Yop.
Dans la série des articles courts… Créer un rôle utilisateur « Propriétaire » pour mes clients : en somme, un Éditeur avec des super-pouvoirs.
J’avais fait, il y a fort longtemps et dans une contrée lointaine, un article ayant ce même but. Cette fois, le code est mis au gout du jour, et empaqueté dans un plugin. Comme ça, plus de problèmes.
Encore un petit truc que j’aurais dû faire depuis longtemps : mettre tout ceci au propre dans un petit plugin prêt à l’emploi.
En bref, voilà le code du plugin.
01020304050607080910111213141516171819202122232425262728293031323334
/* !---------------------------------------------------------------------------------*/
/* ! I18N */
/*-----------------------------------------------------------------------------------*/
add_action( 'plugins_loaded', 'sfor_lang_init' );
function sfor_lang_init() {
load_plugin_textdomain( 'default', false, basename( dirname( __FILE__ ) ) . '/languages' );
}
/* !---------------------------------------------------------------------------------*/
/* ! CREATE THE NEW ROLE */
/*-----------------------------------------------------------------------------------*/
register_activation_hook( __FILE__, 'sfor_create_role' );
function sfor_create_role() {
// Creates a Owner User Role (editor level, with super-powers)
if ( $editor = get_role('editor') ) {
remove_role( 'owner' );
add_role( 'owner', 'Owner', $editor->capabilities );
$owner = get_role('owner');
// Can manipulate users
$owner->add_cap( 'list_users' );
$owner->add_cap( 'create_users' );
$owner->add_cap( 'edit_users' );
$owner->add_cap( 'promote_users' );
$owner->add_cap( 'delete_users' );
$owner->add_cap( 'remove_users' );
// Can edit theme options and menus
$owner->add_cap( 'edit_theme_options' );
}
}
Le plugin ne fait que deux choses :
- Charger la traduction du nom du rôle.
- Créer le rôle à l’activation du plugin, s’il n’existe pas déjà.
Créer le rôle utilisateur
Avec la condition if
je récupère déjà le rôle « editor », ce rôle me servira de base (en gros, je vérifie que le rôle existe bien).
En fait, ce nouveau rôle « Propriétaire » est un Éditeur auquel on va ajouter la possibilité de lister et éditer les utilisateurs, ainsi que de pouvoir éditer les options du thème et modifier les menus.
Noter l’utilisation de add_role()
:
20
add_role('owner', 'Owner', $editor->capabilities);
'owner'
: l’identifiant du rôle, au même titre que « editor » pour un éditeur.
'Owner'
: le nom du rôle. Un détail important ici, on ne met pas directement 'Propriétaire'
ni même __('Owner')
. Le nom doit être ici en anglais, non traduit. C’est la condition pour avoir un nom de rôle qui sera traduit correctement plus tard par WordPress. J’y reviendrais plus tard.
$editor->capabilities
: le rôle créé est tout d’abord identique à un éditeur, on lui donne les même capacités.
Ensuite, on récupère le rôle ‘owner’ nouvellement créé puis on lui ajoute les capacités désirées.
Et c’est tout. Cette partie du code n’est utilisée qu’une seule fois, le nouveau rôle est alors enregistré en base de donnée.
Internationalisation
Cette partie a été un long parcours semé de pièges pour trouver la bonne façon de faire.
Il y a 3 points importants à respecter pour que tout fonctionne bien.
- On a déjà le premier, au niveau
add_role()
: ne pas traduire directement le nom du rôle. - Au moment d’utiliser
load_plugin_textdomain()
, il faut se servir du domaine « default », qui est le domaine qu’utilise WordPress. - Dans le fichier le langage .po il faut utiliser le contexte « User role », ce qui va donner :
msgctxt "User role" msgid "Owner" msgstr "Propriétaire"
Hop, terminé. Finalement l’article n’est pas aussi court que prévu ^^.
See ya!
Edith : l’idée de Rahe dans les commentaires étant tout à fait pertinente, le rôle est supprimé puis recréé à chaque activation du plugin.
Commentaires
Commentaire de Kregg.
Salut,
oui merci je connais tout ça, je n’avais juste pas vu le bouton de téléchargement.
Je me demandait donc comment utiliser ce code.
merci !
Kregg
Commentaire de Martineau.
Bonjour, je voulais savoir si il était possible de mettre le nom du rôle à coter de leur Identifiant.
MrGhostFire (mon identifiant)
Admin (mon rôle)
Exemple :
[Admin] MrGhostFire
Si vous savez comment faire, ditent le moi svp avec un petit screen si possible :D
Commentaire de Flo.
Bonjour,
J’ai ajouté la permission « edit_theme_options », mais du coup ça autorise la modification du thème, header, beackground etc …
Et j’ai envie uniquement d’autoriser l’accès aux widgets (widgets.php), donc comment faire ?
Merci d’avance.
Commentaire de Grégory Viguier.
Salut Flo.
Il n’y a pas de permissions séparées pour chaque onglet du menu, il te faudra donc retirer les onglets Thème, Header, etc du menu pour ces utilisateurs (et leur interdire l’accès à ces pages).