Je souhaite attribuer à un groupe de types d'utilisateurs (éditeur + un rôle personnalisé) la fonctionnalité add_users/create_users. Le seul problème est que je voulais limiter cette possibilité à l’ajout d’utilisateurs de type "abonné", et rien d’autre. Y a-t-il un moyen de faire cela?
La première étape pour y parvenir consiste à ajouter la possibilité à create_users
à un rôle donné. Vous appelez get_role
, puis utilisez la méthode add_cap
. Cela a seulement besoin d'être fait une fois. Voici un exemple qui le fait lors de l'activation d'un plugin.
<?php
register_activation_hook( __FILE__, 'wpse42003_activation' );
function wpse42003_activation()
{
foreach( array( 'editor', 'your_custome_role' ) as $r )
{
$role = get_role( $r );
if( $role )
$role->add_cap( 'create_users' );
}
}
Si vous faites cela, vous voulez probablement vous assurer de l'annuler lors de la désactivation du plugin avec remove_cap
.
<?php
register_deactivation_hook( __FILE__, 'wpse42003_deactivation' );
function wpse42003_deactivation()
{
foreach( array( 'editor', 'your_custome_role' ) as $r )
{
$role = get_role( $r );
if( $role )
$role->remove_cap( 'create_users' );
}
}
Il s’agit maintenant de s’assurer que ces utilisateurs ne peuvent enregistrer que des abonnés. Sur la page user-new.php
, la liste déroulante des rôles est générée par une fonction appelée wp_dropdown_roles
, qui à son tour appelle la fonction get_editable_roles
pour extraire les rôles que l'utilisateur actuel peut modifier/créer.
Heureusement pour vous, il y a un filtre qui nous permettra de modifier ce bit. Nous allons d’abord copier toutes les clés du tableau $roles
, puis parcourir et désélectionner tout rôle autre que abonné de $roles
- uniquement si l’utilisateur actuel dispose de l’éditeur de rôles ou de votre rôle personnalisé.
<?php
add_filter( 'editable_roles', 'wpse42003_filter_roles' );
function wpse42003_filter_roles( $roles )
{
$user = wp_get_current_user();
if( in_array( 'editor', $user->roles ) || in_array( 'your_custom_role', $user->roles ) )
{
$tmp = array_keys( $roles );
foreach( $tmp as $r )
{
if( 'subscriber' == $r ) continue;
unset( $roles[$r] );
}
}
return $roles;
}
La partie bonus de ceci est que get_editable_roles
est appelé avant qu'un utilisateur soit ajouté ou mis à jour - vos éditeurs ne pourront pas ajouter d'utilisateurs en insérant des options supplémentaires dans le formulaire avec JS ou quelque chose de similaire.
note: remplacez your_custom_role
par les exemples ci-dessus par le nom de votre rôle.
Tout ça comme un plugin .
La réponse de @chrisguitarguy est bonne. J'ai apporté une petite modification au code pour le faire fonctionner à partir d'un bureau de développement au service des clients sur une installation multi-site. Nous avions besoin de créer un rôle d'utilisateur "client", mais bien entendu, un client ne devrait pas être autorisé à ajouter un autre client à son domaine. Modifié à partir de la réponse acceptée, j'en suis venu à ceci:
/**
* Add filter to ensure a Customer type can NOT create another Customer user
*/
add_filter( 'editable_roles', 'limit_create_user' );
function limit_create_user( $roles ){
$user = wp_get_current_user();
if( in_array( 'customer', $user->roles )){
unset( $roles[ 'customer' ]);
}
return $roles;
}
En espérant que quelqu'un puisse en trouver une utilité dans le futur. Cela a été testé et appliqué dans WP3.9.1.