Dans WordPress il est parfois utile d’avoir des rôles personnalisés en plus de ceux proposés par défaut. Pour rappel, les rôles sont « Administrateur », « Éditeur », etc.
Aujourd’hui nous allons voir comment créer un nouveau rôle avec des « capabilities » personnalisées.
EDIT 28/01/2014 : vous pouvez oublier cet article et aller voir celui-ci dont le code fonctionne correctement.
Pourquoi créer un rôle spécial?
On pourrait imaginer avoir besoin d’un type d’abonné spécial, et y ajouter une « capability » qui n’existe pas, afin d’utiliser un plugin par exemple. Les « capabilities » sont des droits, pour cela je vous renvoies vers le codex de WordPress (anglais), où on y compare les rôles et leurs droits.
Bref, je ne sais pas vous, mais lorsque je réalise un site pour quelqu’un, je ne me vois pas lui donner les droits Administrateur et risquer que cette personne fasse une gaffe et mette le site en rade (à moins que la personne s’y connaisse, mais c’est rare car elle ne ferait pas appel à moi sinon). Le but n’est pas de donner un minimum de droits à la personne sur son propre site mais au contraire, lui donner un maximum de libertés sans risquer de gros dégâts. C’est pour ça que lorsque je crée un site pour quelqu’un, je crée un rôle « Propriétaire » avec des droits entre « Administrateur » et « Éditeur ».
[warning] Faire ces manipulations sur un site de test, pas sur un site en production! En cas d’erreur le site sera inaccessible!
Assez de blabla
Nous allons d’abord créer une fonction et la hooker à l’initialisation de WordPress.
Ensuite, nous allons copier le rôle Éditeur, créer le nouveau rôle Propriétaire en lui donnant les capabilities de l’Éditeur et lui en rajouter.
Attention, lorsque l’on crée un rôle ou lorsque l’on modifie des capabilities, c’est permanent, cela s’inscrit dans la base de donnée.
Ouvrez le fichier functions.php de votre thème et collez y ceci :
12345678
function modify_capabilities() {
$editor_role = get_role('editor');
add_role('owner', 'Propriétaire', $editor_role->capabilities);
$owner_role = get_role('owner');
$owner_role->add_cap('edit_theme_options');
$owner_role->add_cap('list_users');
}
add_action('init','modify_capabilities');
Avec get_role('editor')
on enregistre le rôle (qui est un objet php) dans une variable.
Ensuite nous utilisons add_role();
pour ajouter un nouveau rôle. En paramètre nous lui fournissons un identifiant unique ‘owner’, un nom d’affichage ‘Propriétaire’ et des droits : les capabilities du rôle Éditeur.
Puis, on lui ajoute d’autres capabilities (voir la page du codex pour la liste complète) : edit_theme_options
pour permettre de rajouter des liens dans les menus (ça donne aussi le droit de changer de thème), list_users
pour permettre de voir la liste de tous les inscrits sur le site.
Nota : pour les opérations inverses, on utilisera remove_cap()
pour enlever des capabilities et remove_role()
pour supprimer un rôle (les modifications ne disparaissent pas si on supprime le code de functions.php).
Ce que je fais également, c’est donner le droit manage_options
afin de pouvoir accéder à certains plugins. Mais c’est risqué car on ouvre tout un panel de possibilités à ce ‘Propriétaire’, donc l’étape suivante sera de personnaliser l’interface de l’administration en supprimant quelques liens du sous-menu « Réglages ». En fait, supprimer des liens dans le menu n’empêche pas la personne d’accéder aux dites pages (puisqu’elle a le droit), mais si la personne est assez maline pour y accéder, alors elle est assez maline pour ne pas mettre le bazar dans les réglages du site. Et à ce niveau là, autant lui donner un rôle Administrateur ;)
Mais tout ceci fera l’objet d’un autre tutoriel :)
EDIT 02/05/2011 : l’article Personnaliser son administration est enfin disponible. Parmi d’autres choses, on y trouve comment modifier le menu de l’administration.
Commentaires
Commentaire de sebastien.
dans mon fichier functions.php j’ai collé ce code :
function modify_capabilities() {
$editor_role = get_role('editor');
add_role('owner', 'Propriétaire', $editor_role->capabilities);
$owner_role = get_role('owner');
$owner_role->add_cap('edit_theme_options');
$owner_role->add_cap('list_users');
}
add_action('init','modify_capabilities');
=> plantage, page blanche et ce message d’erreur :
Fatal error: Cannot use string offset as an array in /hohoho/hahaha/demo/wp-includes/capabilities.php on line 112
Commentaire de Greg.
Salut Sébastien.
Le problème subsiste si vous supprimez le code ?
Si le problème est toujours là, je suggère de supprimer le nouveau rôle :
1234
et d’utiliser le plugin members.
Commentaire de sebastien.
oui le probleme persiste. Et la page reste blanche. A quoi est-ce dû ?
Commentaire de Greg.
Peut-être un problème de copier/coller avec des caractères qui ne sont pas passés, que sais-je.
Vous avez essayé le code que j’ai donné au-dessus pour supprimer le rôle ?
Commentaire de JeanMi.
J’ai le même problème que Sébastien j’ai collé le code, puis plantage, le code pour supprimer le nouveau rôle ne change rien.
C’est une install test donc sans conséquence mais ce code ne semble plus fonctionner ?
Commentaire de Greg.
Salut JeanMi.
Le code fonctionne, je l’ai utilisé il y a moins d’un mois.
Commentaire de etienne.
Salut, moi j’ai une question par rapport a cet article..
Comment peut on laisser les membres choisir leur role ? (compris entre les niveaux 0 et 1 par exemple dans un menu déroulant accessible qu’une seule fois)
J’ai fais pas mal de recherche je trouve rien sur le sujet…si vous aviez des pistes :)
Merci
Commentaire de Greg.
Etienne, rien vu de tel jusque là hélas.
Commentaire de john.
Salut,
J’ai aussi appliqué ce code dans function.php et au rechargement de la page de connexion à l’admin j’ai le message suivant : « Fatal error: Can not use string offset as an array in / home / Mius / public_html / wp-includes / capabilities.php on line 112 ».
Est-ce qu’un paramètre n’est pas correct ??
Merci pour votre retour.
Commentaire de Greg.
John, des caractères « spéciaux » dans le nom du rôle ? Par exemple dans l’article j’ai utilisé « owner » : ne pas mettre d’espaces ou autres.
Perso je n’utilise que des caractères [a-z] en minuscules. Peut-être que le undescore « _ » marcherait aussi, pas testé (il faudrait étudier toute la chaine users/roles/capabilities, gros travail que je n’ai pas fait en entier).
Commentaire de cchaudey.
Bonjour,
merci pour cet article intéressant. Il y a cependant des trucs qui m’échappent.
– 1ère question comment ajouter des capabilities qui ne sont pas natives à wordpress (créées par un plugin par exemple). Je prends un exemple concret, j’ai besoin d’autoriser les membres de mon site à utiliser certaines fonctions, mais les interdire d’en utiliser d’autres fournies par des plugins (je ne veux les autoriser qu’une fonction bien précise parmi les 10-12 proposées par le plugin)
-2 ème question: dans le codex, la liste des rôles me paraît un peu bizarre, par exemple
create_products
Since 3.0
Multi-site only
Allows access to Super Admin menu
Allows user to upgrade network
J’utilise un plugin nommé MarketPress, qui permet de créer des produits (c’est à dire des objets mis en vente sur le site), il s’agit en fait d’un custom post type nommé « product ». Du coup, je suis un peu confus sur ce capability « create_product » qui donne accès au menu du Super Admin.
Commentaire de Greg.
Salut cchaudey.
1- Comme tu le fais avec une capa’ native, aucune différence :)
2- Première fois que je vois cette capa’ « create_products ». AMHA il s’agit d’une erreur, ça n’a aucun sens dans ce contexte. Je pense donc que tu peux ajouter cette capa’ sans soucis. Ce que je ferais : j’ajouterais cette capa’ à un rôle, me créerais un utilisateur ayant ce rôle et me connecterais avec. Si j’ai accès au menu super admin alors que je ne devrais pas, retour en arrière et je cherche plus loin.
Je peux aussi te conseiller le plugin Members qui permet de faire tout ça simplement. Je l’ai découvert après avoir écrit l’article et l’ai utilisé dans un projet. Il est en anglais mais fonctionne sans problèmes.
Commentaire de cchaudey.
Merci pour ta réponse. Je n’ai pas compris ce que tu veux dire dans la 1ère question. Je veux utiliser des fonctions rajoutées par des plugins, donc non natives.
Pour le plugin membres je vais jeter un oeil. Mais dans mon cas il s’agit d’une installation multi-sites, je crée une marketplace dans laquelle les membres ont un site à eux dès l’inscription, mais je ne veux pas qu’ils puissent utiliser telle ou telle fonction de certains de mes plugins. Je voudrais par exemple les limiter à la création de 5 produits pour les membres Silver, et 10 pour les membres gold.
Commentaire de Greg.
Re.
Je voulais dire qu’une capa, qu’elle soit native ou ajoutée par un plugin, s’utilise de la même manière. Ainsi tu peux faire :
ou encore :
Pour le plugin, je l’ai utilisé sur un multisite également, pas de problèmes.
Commentaire de cchaudey.
Oui j’avais bien compris ça mais je voulais dire comment je peux savoir le nom de la capacité si c’est celle d’un plugin? Je veux dire c’est pas dans la liste du codex.
Commentaire de Greg.
Ha ok, my bad. Plusieurs solutions :
– Fouiller dans le plugin.
– Faire un tour du côté du support du plugin.
– Utiliser le plugin Members (il liste toutes les capas).
– Sur un site qui n’est pas en production (ou dans un coin inaccessible au public), faire quelque chose comme ceci dans une page, ou via un add_action/add_filter, pour afficher les capas du rôle administrateur (qui contient donc celles du plugin à priori) :