Pour un plugin sur lequel je travaille actuellement, je voulais accorder / restreindre l'accès aux paramètres du plugin (c'est-à-dire aux pages du menu d'administration correspondant) sur une base par rôle .
Par conséquent, j'ai dû ajouter un nouveau plugin spécifique capability
auuser roles
.
Malheureusement, la réponse de Kaiser ne semble plus fonctionner, j'ai donc passé un peu de temps à essayer de comprendre comment autoriser les fonctionnalités mentionnées ci-dessus.
L'horaire
Avant de partager mon code avec vous, voici de quoi il s'agit, en texte clair:
- Lors de l'activation du plugin, ajoutez la nouvelle capacité
THE_NEW_CAP
aux rôles ayant une certaine capacité intégrée BUILT_IN_CAP
(dans mon cas:) edit_pages
.
- À chaque chargement de page, faites 1. (c.-à-d., Ajoutez la capacité, encore une fois). Cela n'est nécessaire que si vous souhaitez tenir compte des nouveaux rôles possibles qui ont été créés après l'activation du plugin. Par conséquent, ces nouveaux rôles n'ont pas la capacité spécifique au plugin, même s'ils ont la capacité intégrée requise.
- Utilisez la nouvelle capacité pour tout ce que vous voulez. Comme expliqué précédemment, je l'utilise pour accorder / restreindre l'accès aux pages du menu d'administration du plugin, c'est ainsi que cela se fait dans l'exemple de code suivant.
- Lors de la désactivation du plugin, supprimez la capacité. Bien sûr, vous pouvez également le faire lors de la désinstallation du plugin. Quoi qu'il en soit, faites-le finalement.
Le code
Et voici la liste ci-dessus convertie en code:
»Configuration
class WPSE35165Plugin {
public function __construct() {
// Register hooks
register_activation_hook(__FILE__, array(__CLASS__, 'activation'));
register_deactivation_hook(__FILE__, array(__CLASS__, 'deactivation'));
// Add actions
add_action('admin_menu', array(__CLASS__, 'admin_menu'));
}
public function activation() {
self::add_cap();
}
// Add the new capability to all roles having a certain built-in capability
private static function add_cap() {
$roles = get_editable_roles();
foreach ($GLOBALS['wp_roles']->role_objects as $key => $role) {
if (isset($roles[$key]) && $role->has_cap('BUILT_IN_CAP')) {
$role->add_cap('THE_NEW_CAP');
}
}
}
" En l'utilisant
// Add plugin menu pages to admin menu
public function admin_menu() {
// Remove the following line if you don't care about new roles
// that have been created after plugin activation
self::add_cap();
// Set up the plugin admin menu
add_menu_page('Menu', 'Menu', 'THE_NEW_CAP', …);
add_submenu_page('wpse35165', 'Submenu', 'Submenu', 'THE_NEW_CAP', ...);
}
»Le nettoyer
public function deactivation() {
self::remove_cap();
}
// Remove the plugin-specific custom capability
private static function remove_cap() {
$roles = get_editable_roles();
foreach ($GLOBALS['wp_roles']->role_objects as $key => $role) {
if (isset($roles[$key]) && $role->has_cap('THE_NEW_CAP')) {
$role->remove_cap('THE_NEW_CAP');
}
}
}
}
Remarque: veuillez ne pas utiliser les capacités en majuscules. C'est juste pour la lisibilité.