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 Julio Potier @ BoiteAWeb.
Bonsoir !
Euh je ne peux pas commenter en fait, je dois aller faire un tour chez mes clients moi x) J’ai un truc à faire d’urgence, a+
ps : copier/coller
Commentaire de Grégory Viguier.
Héhé, oui c’est vrai que je n’ai même pas dit pourquoi un tel plugin peut paraitre nécessaire ^^’
Commentaire de Rahe.
Hello !
Je serais d’avis de supprimer le rôle existant en activant le plugin, sinon les nouvelles règles écrites entre temps ne seront pas ajoutées au rôle.
Commentaire de Julio Potier @ BoiteAWeb.
Je vois, donc on supprime le rôle, même s’il est affecté, puis on le recrée en se basant de nouveau sur le même rôle Editeur afin d’être sûr que toutes les règles soient bien reprises.
Bueno ça, merci !
Commentaire de Rahe.
Ouais ! Ca évitera des heures de debug pour un problème comme ça :/
Commentaire de Grégory Viguier.
Salut.
« sinon les nouvelles règles écrites entre temps ne seront pas ajoutées au rôle »
Tu veux dire les nouvelles règles qui pourraient être ajoutées au rôle éditeur via un autre plugin ?
Commentaire de Julio Potier @ BoiteAWeb.
via un autre plugin entre le temps où tu as créé le role Owner et maintenant. Tout ajout de capa se verraient alors oubliées.
Si le but est justement de ne se baser que sur le rôle nu de WordPress, alors là il faut plutôt créer un rôle depuis 0.
Commentaire de Grégory Viguier.
« via un autre plugin entre le temps où tu as créé le role Owner et maintenant »
Ajoutées à qui ? Editeur ou Proprio ?
Commentaire de Julio Potier @ BoiteAWeb.
a Editeur, tu te bases le Lundi (jour d’activation de ton plugin) sur l’Editeur, le mardi, le role Owner est déjà créé. Le mercredi un plugin ajoute une capa sur Editeur. L’Owner n’en bénéficie pas. Volontaire ? Je ne crois pas.
Commentaire de Grégory Viguier.
Ok, donc ça revient à dire que le plugin tiers se contre-fiche des rôles custom et se borne aux rôles par défaut. C’est un peu comme ce que je t’ai montré dans White Label CMS toute à l’heure : « Non non non, il n’y a que administrator, editor, etc, les autres n’existent pas ».
Ouais je suis de mauvaise fois car la situation n’est pas la même, mais comme je suis de mauvais poil aujourd’hui, j’ai le droit =D
Commentaire de Julio Potier @ BoiteAWeb.
Non pas du tout.
Le plugin Y ne connais pas ton rôle, il veut juste ajouter une capa sur les Editeurs.
Maintenant, je mets ton plugin, si donc mon editeur modifié par Y, et de ça en sort un Owner. Ok.
Mais si je crée d’abord le Owner avec ton plugin puis ensuite j’ajoute le plugin Y, alors il va manquer une capa !
Capicce ?
Commentaire de Grégory Viguier.
J’avais compris.
« Le plugin Y ne connais pas ton rôle »
Ha bon ? C’est pas si dur pourtant.
010203040506070809101112131415
:)
Commentaire de Julio Potier @ BoiteAWeb.
-_- et puis, ok il va trouver X roles. Et il va leur assigner une capa de plus comme ça sans savoir ?
Non le plugin Y ajoute une capa sur l’Editeur, il ne PEUT PAS et ne VEUT PAS et ne DOIT PAS le faire ailleurs ! o_O tu me fais rager exprès ou pas ?
Commentaire de Grégory Viguier.
N’empêche que je ne suis toujours pas d’accord avec ça : « il ne PEUT PAS et ne VEUT PAS et ne DOIT PAS le faire ailleurs ».
S’il le veut, il peut, et je ne vois pas pourquoi il ne devrait pas.
:P
Commentaire de Grégory Viguier.
Merde, busted.
Commentaire de Julio Potier @ BoiteAWeb.
han mais t’es un vilain. Bon capicce hein là :p 1.1 ok je look x) merci Rahe, c’est ta faute tout ça !
Commentaire de Rahe.
Ahaha ouais ! La prochaine fois je veux du sang et des tripes ! :D
Commentaire de Julio Potier @ BoiteAWeb.
RDV EN JANVIER MA GUEULE !
Commentaire de Grégory Viguier.
array_push( « v 1.1 » );
Commentaire de Kregg.
Salut,
votre code m’intéresse bien mais pourquoi parlez-vous de plugin?
Bonjour,
s’agit-il d’un plugin ou d’un morceau de code à placer dans function.php ?
S’il s’agit d’un plugin c’est quoi le truc : créer un nouveau fichier avec ce code dedans ?
Pourriez vous développer la démarche à suivre s’il vous plaît ?
merci pour votre réponse,
cordialement,
Kregg
Commentaire de Grégory Viguier.
Salut.
Je parle de plugin car il s’agit d’un plugin, ce code ne marchera pas dans le fichier functions.php de votre thème.
La création d’un rôle devrait plutôt se trouver dans un plugin, et pas dans le functions.php d’un thème, car si on change de thème, le code part avec, et ce n’est pas une fonctionnalité propre au thème.
La démarche est simple : en haut il y a un bouton « Download », clic !
Puis dans votre administration : « Extensions » >> « Ajouter » >> « Envoyer » (en haut) pour installer le plugin via le fichier zip.