Para un complemento en el que estoy trabajando actualmente, quería otorgar / restringir el acceso a la configuración del complemento (es decir, las páginas correspondientes del menú de administración) en función de cada rol .
Por lo tanto, tuve que agregar un nuevo complemento específico capability
parauser roles
.
Desafortunadamente, la respuesta de Kaiser parece que ya no funciona, así que pasé un tiempo tratando de descubrir cómo permitir la funcionalidad mencionada anteriormente.
El horario
Antes de compartir mi código con usted, esto es de lo que se trata, en texto plano:
- En la activación del complemento, agregue la nueva capacidad
THE_NEW_CAP
a los roles que tienen una cierta capacidad incorporada BUILT_IN_CAP
(en mi caso:) edit_pages
.
- En cada carga de página, haga 1. (es decir, agregue la capacidad, nuevamente). Esto solo es necesario si desea dar cuenta de posibles roles nuevos que se han creado después de la activación del complemento. Por lo tanto, estos nuevos roles no tienen la capacidad específica del complemento, incluso si tienen la capacidad incorporada requerida.
- Use la nueva capacidad para lo que quiera. Como se explicó anteriormente, lo uso para otorgar / restringir el acceso a las páginas del menú de administración del complemento, así es como se hace en el siguiente ejemplo de código.
- En la desactivación del complemento, elimine la capacidad. Por supuesto, también puede hacer esto cuando se desinstala el complemento. De cualquier manera, hágalo eventualmente.
El código
Y aquí está la lista anterior convertida en código:
»Configurarlo
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');
}
}
}
»Utilizándolo
// 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', ...);
}
»Limpiarlo
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');
}
}
}
}
Nota: no utilice las mayúsculas. Esto es solo para facilitar la lectura.