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 del menú de administración correspondientes) en una base por función .
Por lo tanto, tuve que agregar un nuevo complemento específico capability
al user roles
.
Lamentablemente, la respuesta del kaiser parece que ya no funciona, así que dediqué un tiempo a intentar averiguar cómo para permitir la funcionalidad mencionada anteriormente.
El horario
Antes de compartir mi código contigo, aquí está de qué se trata, en texto simple:
- En la activación del complemento, agregue la nueva capacidad
THE_NEW_CAP
a los roles que tengan cierta capacidad incorporada BUILT_IN_CAP
(en mi caso: edit_pages
).
- En cada carga de página, haga 1. (es decir, agregue la capacidad, otra vez). Esto solo es necesario si desea tener en cuenta los nuevos roles posibles 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.
- Usa la nueva capacidad para lo que quieras. 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, hazlo eventualmente.
El Código
Y aquí está la lista anterior convertida en código:
»Configurándolo
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');
}
}
}
»Usá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', ...);
}
»Limpiándolo
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.