Si gestionas sitios de clientes y quieres eliminar acceso a los menús de administración, aunque el usuario sea administrador, puedes hacerlo de un modo muy sencillo y, lo más importante, sin tocar los archivos ‘core
‘ de WordPress, con lo que no tendrás que rehacer las modificaciones tras una actualización.
Como ya estarás imaginando, echaremos mano del fichero functions.php
de tu tema activo – y si no existe lo creas ahora mismo – y le añadiremos este código:
//quitar menus de admin function quitar_menus () { global $menu; $restricted = array( __('Posts'), __('Media'), __('Links'), __('Pages'), __('Appearance'), __('Tools'), __('Users'), __('Settings'), __('Comments'), __('Plugins')); end ($menu); while (prev($menu)){ $value = explode(' ',$menu[key($menu)][0]); if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);} } } add_action('admin_menu', 'quitar_menus');
¿Que consigues con esto?, pues que solo se vean los menús personalizados – normalmente los que añaden los plugins – y aquellos que elimines de la lista de $restricted
. En el ejemplo anterior solo verías el escritorio y aquellos menús de los plugins que tengas activos y a los que, por tu perfil de usuario, tengas acceso, justo lo que ves arriba en la captura.
Si también quieres quitar acceso al escritorio solo tendrías que añadir a la ista __('Dashboard'),
.
Ahora bien, un usuario avezado aún podrá acceder a las distintas secciones tecleando la URL, o sea, que aunque quites el menú, si alguien teclea http://tudominio.com/wp-admin/plugins.php
tendrá acceso. Si quieres eliminar también esa posibilidad, para los menús que definas, entonces el código se debe complicar un poco más, algo así:
function quitar_menus () { global $menu, $submenu, $user_ID; $the_user = new WP_User($user_ID); $valid_page = "admin.php?page=contact-form-7/admin/admin.php"; $restricted = array('edit.php','categories.php','upload.php','link-manager.php','edit-pages.php','edit-comments.php', 'themes.php', 'plugins.php', 'users.php', 'profile.php', 'tools.php', 'options-general.php'); $restricted_str = 'widgets.php'; end ($menu); while (prev($menu)){ $menu_item = $menu[key($menu)]; $restricted_str .= '|'.$menu_item[2]; if(in_array($menu_item[2] , $restricted)){ $submenu_item = $submenu[$menu_item[2]]; if($submenu_item != NULL){ $tmp = $submenu_item; $max = array_pop(array_keys($tmp)); for($i = $max; $i > 0;$i-=5){ if($submenu_item[$i] != NULL){ $restricted_str .= '|'.$submenu[$menu_item[2]][$i][2]; unset($submenu[$menu_item[2]][$i]); } } } unset($menu[key($menu)]); } } $result = preg_match('/(.*?)\/wp-admin\/?('.$restricted_str.')??(('.$restricted_str.'){1})(.*?)/',$_SERVER['REQUEST_URI']); if ($result != 0 && $result != FALSE){ wp_redirect(get_option('siteurl') . '/wp-admin/' . $valid_page); exit(0); } } add_action('admin_menu', 'quitar_menus');
Con este código eliminas la visualización y el acceso a los menús. Y en la lista de $restricted
puedes añadir o quitar a voluntad los menús a los que se tendrá acceso.
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!
Fernando y si quiero hacer esto pero solo para los que tienen cuenta de Suscriptor? en este caso me interesa borrar el "Escritorio" para todos los suscritores
me apunto, pero para un ID de usuario. 😉
Me suscribo para hacer lo mismo con usuario colaborador, como es el código? gracias
Por lo menos deben citar la fuente no?
Fernando la cita al principio de la entrada cuando dice "eliminar acceso a los menús de administración" fíjate bien y deja de crear problemas donde no los hay.
Está citada, como siempre que la hay, y es el caso. Ya he dicho por activa y pasiva que suelo enlazar en contexto, ofreciendo incluso anchor text a la fuente. No me seas tiquismiquis y fíjate hombre, por favor 😉
Fernando, pero este codigo limita el acceso a todos los usuarios ? o como regreso a ver nuevamente todas las opciones del panel de administracion con el usuario ADMIN ?
esto esta bastante bien ¿pero en vez de ponerlo en la plantilla en el archivo functions.php lo podriamos poner en un plugin para ser mas práctico?
Por otro lado ya que estamos con el tema, alguien tiene alguna idea de como hacer para que el plugin Google Analitycator muestre las estdisticas de visita a todos los usuarios y no solo al administrador? (ya probé con role manager/scooper y no sirvió)
Como se puede hacer para los que tienen cuenta de Suscriptor?
¿en qué parte de ese archivo se agrega el código? No me ha funcionado, me manda errores:
Warning: preg_match() [function.preg-match]: Unknown modifier 'o' in…
se refiere a la línea:
$result = preg_match('/(.*?)/wp-admin/?('.$restricted_str.')??(('.$restricted_str.'){1})(.*?)/',$_SERVER['REQUEST_URI']);
Excelente tutorial, me ha servido mucho ahora que estoy empezando a utilizar Wordpress como Gestor de Contenidos para mis clientes.
Buenas,
Muy interesante el artículo.
Me gustaría saber si hay algún plugin u opción para aplicar esta idea según usuario, y según nombre de usuario, ya que cuando un wordpress lo utiliza mucha gente, sería muy interesante esta opción.
Muchas gracias.
Como puedo actualizar este código para que le quite elementos a un usuario en particular? Gracias.
Para los que quieren/les interesa hacerlo sólo para un usuario concreto (o para el resto de usuarios, depende del caso), acá dejo cómo lo hice yo:
// Función para eliminar menús del menú lateral izquierdo del panel de administración o dashboard (a todos los usuarios menos al administrador)
function remove_menus () {
global $menu;
$restricted = array(__(‘Appearance’), __(‘Plugins’), __(‘Shareaholic’));
end ($menu);
while (prev($menu)){
$value = explode(‘ ‘,$menu[key($menu)][0]);
if(in_array($value[0] != NULL?$value[0]:»» , $restricted)) {
unset($menu[key($menu)]);
}
}
}
if ($current_user->ID != 1) {
add_action(‘admin_menu’, ‘remove_menus’);
}
Es decir, tan sólo deben añadir un comprobación (un «if») al final, cuando vayan a aplicar los cambios al menú de admin.
Yo en mi caso lo hice mediante el ID de usuario, ya que sé que el único usuario que no quiero que se le oculten los menús sea el de ID=1, pero pueden modificarlo a su gusto y necesidad. 😉
Por cierto, lo que no sé (y aún sigo buscando) es la manera de hacerlo también para cualquier otro menú que nos creen los plugins, como el de «Sexy Bookmarks», el cual ya intenté eliminar probando a escribir «Shareaholic», «Sexy-Bookmarks», «SexyBookmarks»…, pero nada, no hay manera de que desaparezca.
Si alguien sabe algo sería de agradecer. 🙂
Hola… quisiera eliminar el menú setting pero el que está adentro del menú woocommerce, es decir, que se vea el menú woocommerce pero no el setting que está dentro de él…es posible?