¿Es posible ocultar la interfaz/menú de Custom Post Type para roles de usuario específicos?
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
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 );

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 - 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.

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');

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.

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 - 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 - ¡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.

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 - 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.

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

¿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

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' );
}

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.

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');

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 );

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&post_type=product' );
// Elimina el submenú Productos > Etiquetas
remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_tag&post_type=product' );
}
}
add_action( 'admin_menu', 'remove_menus_shopmgr', 999 );

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 );
