¿Es posible ocultar la interfaz/menú de Custom Post Type para roles de usuario específicos?

17 sept 2011, 21:51:53
Vistas: 55.9K
Votos: 25

Lo que busco hacer es ocultar completamente la interfaz de usuario para un tipo de entrada personalizada (custom post type) de roles de usuario específicos... Anteriormente he encontrado muchos recursos sobre cómo deshabilitar el acceso al uso de estos CPTs, pero nada que realmente permita ocultar completamente la interfaz del CPT según el usuario que esté conectado al panel de administración.

Esto es importante ya que necesito que los clientes se mantengan completamente alejados de los tipos de entrada personalizados para la tienda, y si aún pueden ver la interfaz de usuario del CPT de la tienda en el panel de administración, no hace diferencia si sus capacidades están restringidas, ya que seguirán preguntando cómo pueden agregar productos por su cuenta como resultado.

Realmente preferiría no lograr esto con un plugin, sin embargo, si hay algo que pueda hacer el trabajo de una manera no sobrecargada, supongo que también sería excelente.

Gracias por tu ayuda, SB

0
Todas las respuestas a la pregunta 7
14
50

Para ocultar un elemento del menú de tipo de publicación a usuarios no administradores:

function wpse28782_remove_menu_items() {
    if( !current_user_can( 'administrator' ) ):
        remove_menu_page( 'edit.php?post_type=your_post_type' );
    endif;
}
add_action( 'admin_menu', 'wpse28782_remove_menu_items' );

your_post_type debe ser el nombre de tu tipo de publicación real.

EDITADO-

Otras páginas de menú que puedes eliminar:

remove_menu_page('edit.php'); // Entradas
remove_menu_page('upload.php'); // Medios
remove_menu_page('link-manager.php'); // Enlaces
remove_menu_page('edit-comments.php'); // Comentarios
remove_menu_page('edit.php?post_type=page'); // Páginas
remove_menu_page('plugins.php'); // Plugins
remove_menu_page('themes.php'); // Apariencia
remove_menu_page('users.php'); // Usuarios
remove_menu_page('tools.php'); // Herramientas
remove_menu_page('options-general.php'); // Ajustes

EDITADO 2 -

Eliminando elementos del menú de plugins.

Para los plugins, parece que solo necesitas el parámetro page= de la consulta. Otra cosa a tener en cuenta es la prioridad, que es el tercer argumento de add_action para admin_menu. Debe establecerse lo suficientemente baja (cuanto mayor sea el número, menor la prioridad) para que los plugins ya se hayan añadido al menú.

function wpse28782_remove_plugin_admin_menu() {
    if( !current_user_can( 'administrator' ) ):
        remove_menu_page('cart66_admin');
    endif;
}
add_action( 'admin_menu', 'wpse28782_remove_plugin_admin_menu', 9999 );
17 sept 2011 22:14:36
Comentarios

¡Qué solución tan sencilla, gracias! Funcionó perfectamente.

Mr.Brown Mr.Brown
17 sept 2011 22:28:11

Curiosidad, ¿wpse28782_remove_menu_items es un nombre de función que elegiste al azar o es específico de WP?... Además, ¿cómo podría ampliar esta idea para apuntar a CPTs adicionales, o incluso a otros menús nativos de WP? ¡Gracias de nuevo por la ayuda!

Mr.Brown Mr.Brown
17 sept 2011 22:32:36

@Mr.Brown - el nombre de la función se basa en el id de tu pregunta (revisa la url), solo algo garantizado para ser único, puedes nombrarlo como quieras siempre que no sea una función existente. También puedes agregar más llamadas remove_menu_page para eliminar otros CPTs, así como otros elementos del menú, mira mi edición.

Milo Milo
17 sept 2011 23:05:01

¡Increíble, gracias de nuevo! Esta es una solución asombrosa.

Mr.Brown Mr.Brown
17 sept 2011 23:06:51

Solo una última cosa - ¿cómo puedo encontrar el nombre de la plantilla que se usa para menús adicionales de plugins que están actualmente instalados? Por ejemplo, remove_menu_page('cart_plugin');

Mr.Brown Mr.Brown
17 sept 2011 23:11:23

Intenté pasar el cursor sobre el elemento del menú y usar la ruta que me dio, pero no funcionó, todavía aparece, aunque los otros elementos del menú se reflejan exactamente como en tu ejemplo cuando pasas el cursor sobre ellos... Estoy usando el plugin Cart66 y esta fue la ruta que apareció al pasar el cursor: remove_menu_page( 'admin.php?page=cart66_admin' ); - pero no pareció funcionar.

Mr.Brown Mr.Brown
17 sept 2011 23:23:03

@Mr.Brown - mira la edición arriba.

Milo Milo
18 sept 2011 02:12:08

Increíble, has sido de gran ayuda. Entonces, ¿todos los plugins solo necesitan la última parte de la ruta y no page=, según entiendo?

Mr.Brown Mr.Brown
18 sept 2011 05:42:58

@Mr.Brown - Así lo creo, al menos los pocos que he revisado. Como prueba, dentro de tu función admin_menu puedes agregar global $menu; y luego print_r( $menu );, lo que revelará el array desde el que se construye el menú (ver el código fuente de la página, o envolverlo en una etiqueta <pre> para mejor legibilidad). El elemento con índice 2 en cada sub-array del menú es lo que querrás usar con remove_menu_page

Milo Milo
18 sept 2011 06:09:16

Milo - ¡muchísimas gracias!...este foro siempre es fantástico, pero tú, señor, me has ayudado a aprender algo de verdad por una vez, así que gracias por tu paciencia y por tomarte el tiempo de explicar todo detalladamente para un principiante como yo. Saludos, SB.

Mr.Brown Mr.Brown
18 sept 2011 07:17:50

Ten en cuenta que esta solución elimina el menú, pero no evita que el usuario acceda a esas páginas mediante la url.

MZAweb MZAweb
19 ene 2014 18:38:43

@MZAweb - cierto, pero si lees la pregunta, eso no era lo que se pedía. La capacidad de acceder a las páginas ya estaba gestionada mediante capacidades.

Milo Milo
19 ene 2014 18:45:52

Excelente respuesta, funcionó perfectamente... gracias por incluir también cómo ocultar elementos además de los CPT.

Simon Simon
19 ene 2016 17:40:39

¿Qué hay acerca de eliminar el New > Post | Media | Page | CPT? Solo necesitas el hook admin_bar_menu - https://wordpress.stackexchange.com/a/76647/84219

jgraup jgraup
19 sept 2018 23:25:40
Mostrar los 9 comentarios restantes
0

La respuesta aceptada puede utilizarse para ocultar tipos de contenido personalizados (y otros elementos varios) como se describe. Pero si quieres ocultar el menú del plugin CPT UI en sí, también puedes eliminar la acción que lo agrega al menú en primer lugar.

if( !current_user_can( 'administrator' ) {
    remove_action( 'admin_menu', 'cptui_plugin_menu' );
}
15 oct 2018 16:21:23
0

También puedes utilizar el plugin Adminimize. Este plugin tiene opciones para todos los tipos de entradas, cajas meta y mucho más para ocultar en diferentes roles. Sin necesidad de código.

11 ene 2013 21:29:12
0

Si deseas ocultar el menú del plugin llamado "Custom Post Type UI" también conocido como CPTUI, no es posible combinando el primer enlace con remove_menu_page.

Todo lo que tienes que hacer es:

function wpse_28782_remove_menus() {
    remove_menu_page('cptui_main_menu');
}
add_action('admin_init', 'wpse_28782_remove_menus');
20 dic 2018 21:57:08
0

Si deseas deshabilitar menús específicos para un rol de usuario en particular, utiliza esto:

function wp2024_remove_unnecessary_menus() {
    $current_user = wp_get_current_user();

    // Definir menús a eliminar
    $menus_to_remove = [
        'elementor',
        'themes.php',
        'plugins.php',
    ];

    if ( in_array( 'user_role_slug', $current_user->roles, true ) ) {
        foreach ( $menus_to_remove as $menu_slug ) {
            remove_menu_page( $menu_slug );
        }
    }
}
add_action( 'admin_menu', 'wp2024_remove_unnecessary_menus', 99 );
22 nov 2024 10:21:37
0

Para ocultar los submenús de Woocommerce bajo el menú principal "Productos" para todos los usuarios con el rol de Shop Manager (WordPress 5.1.1):

function remove_menus_shopmgr(){

// Si el usuario actual es un gestor de tienda
if ( current_user_can('shop_manager') ) {

   // Elimina el submenú Productos > Categorías
    remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_cat&amp;post_type=product' );

   // Elimina el submenú Productos > Etiquetas
    remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_tag&amp;post_type=product' ); 

    }
}

add_action( 'admin_menu', 'remove_menus_shopmgr', 999 );
23 abr 2019 07:56:55
1

Si remove_menu_page no funciona para ti (a mí tampoco me funcionó), una alternativa en lugar de eliminar el menú es indicarle a WordPress que no muestre el menú para el tipo de publicación:

function wpse28782_hide_menu_items() {
    if( !current_user_can( 'administrator' ) ) {
        $post_type = get_post_type_object( 'your_post_type' );
        if ($post_type) {
            $post_type->show_in_menu = false;
        }
    }
}
add_action( 'admin_menu', 'wpse28782_hide_menu_items', 99 );
11 sept 2019 11:52:45
Comentarios

Esto no parece funcionar para mí en una configuración multisitio.

Saqib Saqib
24 sept 2024 16:53:25