Como sabrás, en WordPress existe una gestión de usuarios con diferentes niveles de permisos o capabilities.
Por defecto la gestión de menús desde el panel de administración de WordPress está restringida a usuarios con rol administrador. En algunos casos, te habrás encontrado con la necesidad o la petición de un cliente para que los usuarios con rol Editor puedan tener acceso a la gestión de menús.
Vamos a ver cómo dar permiso a los usuarios con rol Editor para gestionar los menús, con apenas unas líneas de código. Lo primero es asignarle la capability necesaria, que para este caso es edit_theme_options. Esta capability o permiso, da acceso a los usuarios que la tengan a:
- Apariencia > Widgets
- Apariencia > Menus
- Apariencia > Customize si está soportado por el tema
- Apariencia > Background
- Apariencia > Header
Para asignar una capability a un rol determinado, utilizaremos el método add_cap() perteneciente al objeto WP_Role que nos devuelve la función get_role():
$role_object = get_role( 'editor' );
$role_object->add_cap( 'edit_theme_options' );
Simplemente obtenemos el rol editor, y le añadimos la capability edit_theme_options.
¡IMPORTANTE!
El método add_cap almacena en base de datos las capabilities que asignamos a los roles. Por lo tanto, es aconsejable utilizar esto una sóla vez. Una vez ejecutado este código puedes eliminarlo, o mejor, puedes utilizarlo para ejecutar en el hook de activacion de temas y plugins. Si el día de mañana quieres dar marcha atrás, utiliza el método remove_cap.
Elimina el resto de opciones del menú apariencia
Hasta aquí todo bien. Pero ahora un usuario con rol editor tiene acceso a todo el menú de apariencia. Veamos cómo darle acceso únicamente a la gestión de menús, capando el resto de opciones:
<?php
function hide_menus_for_editor_role() {
$role = wp_get_current_user();
$main_roles = array('administrator');
if (!in_array($role->roles[0], $main_roles)) {
// Hide theme selection page
remove_submenu_page( 'themes.php', 'themes.php' );
// Hide widgets page
remove_submenu_page( 'themes.php', 'widgets.php' );
// Hide customize page
global $submenu;
unset( $submenu['themes.php'][6] );
}
}
add_action( 'admin_menu', 'hide_menus_for_editor_role' );
Como ves, actuamos sobre el hook admin_menu. Comprobamos que el rol actual no sea administrador, y lo que hacemos es eliminar las subpáginas del menú de Apariencia. De este modo, un usuario con rol editor sólo tendrá acceso a la edición de menús.