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 camikat.
Bonjour je débute dans le développement et je trouve votre blog plein de ressources…
Je viens de créer un role, pas de souci tout fonctionne :)
Et j’aimerais maintenant interdire à mon propriétaire l’acces dans apparence aux fonctions « header » :
Mais malheureusement quoi que je fasse ça bug je ne dois pas saisir mon code ci-après dans le bon ordre :
01020304050607080910111213
Pouvez m’aider à rectifier ce code , tout au moins à lier les deux fonction !
D’avance merci pour votre précieuse aide
Commentaire de camikat.
N’ayant toujours pas de réponse je me suis peut être ma exprimé, je voulais dire simplement comment enlever à un nouveau role (propriétaire) l’acces dans le menu « apparence » aux fonction d’entête tout en gardant l’acces au reste !
Merci pour votre réponse
Commentaire de Greg.
Bonjour.
Vous vous étiez bien exprimé la première fois, j’étais seulement occupé ailleurs.
J’allais justement proposer d’enlever la capability ‘edit_theme_options’…
La deuxième partie de votre code n’est pas correcte à mon avis, essayez plutôt ceci :
123456
Si ça ne fonctionne pas, essayez de mettre le test
if ( current_user_can('owner') )
à l’intérieur de la fonctionremove_header_menu()
à la place :123456
Commentaire de camikat.
Merci Greg mais cette fonction malheureusement ne marche pas ! Pourtant ces deux morceaux de code me paraissaient bien logiques ! Mais commet cette fonction sait que le menu header est dans le sous menu apparence, il manque peut être quelque chose mais je ne sais pas quoi…
Commentaire de Greg.
Le sous-menu custom-header n’est pas dans le menu apparence? C’est sa place habituelle.
Commentaire de Julio Potier @ BoiteAWeb.
(bump)
Je reviens dessus car je l’ai lu ce matin (oui je lag un peu) et je tiens à dire « attention ».
Faire un get_role(‘editor’); puis lui ajouter des droits peut être dangereux si d’autres droits ont déjà été ajoutés.
Par exemple vous voulez créer un rang qui a le droit d’éditer les options du thème, mais pas ceux des plugins.
Vous prenez « éditeur » et ajoutez ce qu’il faut.
Malchance, l’éditeur avait aussi des droit de modif les plugins car avec « User Role Editor », je lui avait donné ce droit !
Donc moi avec mon plugin, je viens de créer une sorte de faille qui donne à mon rôle le droit d’éditer les options de plugins alors que ce n’était pas prévu.
Sinon pour la forme ça marche, mais je ne peut que recommander de créer un rôle depuis 0 plutôt que de prendre un rôle existant, ne sachant pas les droits à l’avance (et si il faut tout vérifier avant, autant en créer un propre non ?)
Commentaire de Greg.
Ça se tient. Sauf que :
1 – si tu as « User Role Editor », pourquoi donc utiliser cette technique? ;) (à moins que le plugin ne permette pas d’ajouter de nouveaux rôles?),
2 – j’ai « User Role Editor » et le plugin que j’installe créé un nouveau rôle basé sur le rôle éditeur, que j’ai préalablement modifié : ben je vais dans « User Role Editor » et je modifie ce nouveau rôle ;),
3 – je créé un nouveau rôle à partir de zéro et lui ajoute les cap nécessaires pour arriver à un « éditeur-like ». Quelques temps plus tard, pas de bol, une mise à jour WP modifie les cap de certains rôles, dont l’éditeur (ça s’est déjà vu il n’y a pas si longtemps). Paf, mon éditeur sous amphétamines se retrouve amputé de ces nouvelles cap :( (à moins que le dev du plugin ne fasse une mise à jour lui aussi).
Bref, chaque solution a ses petits défauts.
Possible solution :
Peut-être faudrait-il trouver dans le core de WP où et comment sont créés les rôles pour récupérer les cap d’origine (sans les possibles ajouts de certains plugins donc), et faire à chaque màj de WP un update du nouveau rôle. Ça permettrait d’avoir un nouveau rôle toujours basé sur un éditeur non modifié et qui tient compte seulement des mises à jour WP.
Que pense-tu de cette idée?
Commentaire de Julio Potier @ BoiteAWeb.
Oui pourquoi pas, il s’agit des functions « populate_roles_*() », la première est populate_roles_160() dans « wp-admin/includes/schema.php »
a tt’
Commentaire de missblueberry.
super tuto
Malheureusement petit problème pour moi.
j’ai suivi la manip, j’ai intégré le code dans function.php de mon thème.
je souhaitais ajouter la possibilité à mon nouveau rôle propriétaire d’ajouter de nouveau utilisateur.
j’ai donc rajouté : $owner_role->add_cap(‘add_users’); au code proposé.
Catastrophe!!!! :| :| Le site est planté :(
je replace alors le fichier function.php d’origine.
et depuis la page admin reste vierge et mon site a perdu tout son contenu. :,( :,(
est ce que quelqu’un peu m’expliquer ce qu’il se passe et comment puis je faire pour rétablir tout ça…..
Commentaire de Greg.
Salut missblueberry.
Une solution a été trouvée ici : http://www.wordpress-fr.net/support/sujet-54146-role-capabilities#p271721
En gros il faut supprimer le code qui a été ajouté dans functions.php (ce que tu as déjà fait), puis créer un nouveau fichier php à la racine du site contenant le code fourni dans le lien et « visiter » cette nouvelle page.
Tout est expliqué dans le lien ;)
Commentaire de missblueberry.
Merci pour le lien
Tout est redevenu normal: =D
j’avais pourtant l’impression d’avoir suivi la méthode correctement
cela signifie t’il que le code que tu proposes n’est pas bon8 oO O
Que faut il faire alors pour que cela fonctionne parce que j’aimerais vraiment pouvoir créer un user personnalisé
Commentaire de Julio Potier @ BoiteAWeb.
Attention aux copié/collé de code qui peuvent contenir des caractères innatendus et provoquer des bizzareries.