J'ai donc vécu l'enfer avec des rôles personnalisés. Je vais essayer d'être aussi descriptif que possible, pour mettre en valeur mon problème. Avant que quiconque ne le mentionne - j'aimerais éviter d'utiliser un plugin, car c'est pour moi une surexploitation de ce que je considère être un problème simple.
Ce que je veux: 3 rôles - Administrateur, Administrateur inférieur, Utilisateur
Ce que j’avais tenté à l’origine: j’ai supprimé les deux rôles Auteur et Contributeur, pour quitter Administrateur, Éditeur et Abonné. Cela a fonctionné sans problème. J'ai un problème avec la pièce suivante: renommer les rôles restants.
Au départ, je viens de faire la suggestion la plus commune
global $wp_roles;
$wp_roles->roles['editor']['name'] = 'Lesser Admin';
$wp_roles->role_names['editor'] = 'Lesser Admin';
pour les deux derniers rôles (j'ai gardé l'administrateur identique car il était suffisamment proche). Mais cela n'a pas fonctionné. Peu importe les crochets que j’y ai attachés (je l’ai mis sous add_action('init',...)
mais cela n’a pas fonctionné.
J'ai donc essayé d'être chic et j'ai écrit mon propre code pour gérer cela.
function permissionsModification(){
$blogs = wp_get_sites();
$current_blog = get_current_blog_id();
foreach($blogs as $blog):
switch_to_blog($blog['blog_id']);
if(get_role('author') !== null)
remove_role('author');
if(get_role('contributor') !== null)
remove_role('contributor');
$toChange = array(
'editor' => array('lesser', 'Lesser Admin'),
'subscriber' => array('user', 'User')
);
foreach($toChange as $old => $new):
$role = get_role($old);
if($role !== null):
if(get_role($new[0]) === null)
add_role($new[0], $new[1], $role->capabilities);
$users = get_users(array('role'=>$old));
foreach($users as $user):
$user->remove_role($old);
$user->add_role($new[0]);
endforeach;
$opt = get_option('default_role');
if($opt === $old)
set_option('default_role', 'administrator');
remove_role($old);
endif;
endforeach;
endforeach;
switch_to_blog($current_blog);
}
add_action('init','permissionsModification');
La bonne nouvelle: le groupe a réussi à renommer les rôles et les anciens rôles ont disparu.
Mauvaise nouvelle: Un bug extrêmement étrange se produit. Je reçois des erreurs "Index non défini: Nom" partout dans Capabilities.php. J'ai cherché dans la base de données (avoir un accès phpMyAdmin), et j'ai trouvé que dans l'un des sites, le rôle d'abonné était toujours là! Je pensais que cela avait peut-être quelque chose à voir avec les rôles par défaut, donc comme les inscriptions sont interdites, je le configure en tant qu'administrateur pour tester, mais toujours aucun dés (bien qu'il le définisse au rôle par défaut).
L'affichage du panneau de l'utilisateur administrateur réseau indique un espace "vide" indiquant l'emplacement du rôle. Si vous inspectez l'élément, il a pour valeur abonné. Je suis donc à peu près certain que le nom du rôle d’abonné a été supprimé et c’est de là que viennent les erreurs.
Maintenant, la partie intéressante - j'ai parcouru ce code ligne par ligne avec print_r
criblé de partout - et le rôle d'abonné est en train d'être supprimé. Mais je ne sais pas du tout comment cela est réintégré. Je me demande si cela tient au fait qu'il s'agit d'une wordpress multisite, car le rôle d'abonné n'est présent que dans une seule table. Mais je suis encore un peu perdu sur la façon de le réparer.
Tout conseil serait très apprécié.
Donc, grâce à Kaiser, j'ai pu comprendre. Je devais faire deux choses pour que cela fonctionne.
Tout d'abord, j'ai remarqué que la désactivation du plug-in WP User Avatar entraînait la disparition des erreurs. J'ai regardé et réalisé qu'un réglage avait été coché "autoriser les abonnés et les contributeurs à éditer leurs avatars". La décocher et le sauvegarder pour chaque site faisait disparaître les erreurs.
L'autre chose que je devais faire était que le changement ne soit pas appliqué à d'autres sites (même si les erreurs avaient disparu), j'ai donc déplacé toute la fonction du thème vers un plugin dans le dossier mu-plugins. Cela le faisait fonctionner tout le temps (et pour chaque site) de sorte que toutes les modifications se produisaient sans erreur.