Mostrar Taxonomía Personalizada Dentro del Menú Personalizado
Tengo un menú personalizado usando add_menu_page
:
add_menu_page('Mi menú' , 'Algún texto', 'read', 'nwcm');
Debajo de él, muestro un elemento de menú de tipo de contenido personalizado;
// Crear el tipo de contenido personalizado noticias
register_post_type('nwcm_news', array(
'labels' => array(
'name' => __('Noticias para clientes', NWCM_TEXT_DOMAIN) ,
'singular_name' => __('Noticia', NWCM_TEXT_DOMAIN)
) ,
'public' => true,
'has_archive' => true,
'public' => true,
'show_ui' => true,
'show_in_menu' => 'nwcm',
'taxonomies' => array(
'nwcm_news_category'
) ,
));
Luego agrego una taxonomía personalizada vinculada a ese tipo de contenido "nwcm_news":
// registrar taxonomía de noticias
register_taxonomy('nwcm_news_category', 'nwcm_news', array(
'label' => __('Categorías de noticias') ,
'menu_name' => __('Categorías de noticias') ,
'rewrite' => array(
'slug' => 'nwcm_news_category'
) ,
'hierarchical' => true
));
El menú principal y el tipo de contenido personalizado se muestran correctamente... pero, ¡el menú de taxonomía no se muestra! :(
¿Cómo puedo resolver esto? He revisado esta solución pero la respuesta carece del ejemplo de código completo..
Tienes un código desordenado.
He reformateado tu código a uno que realmente funciona.
La siguiente solución te permite darle a tu menú de Tipo de Entrada Personalizado el nombre que desees. Solo cambia la etiqueta "menu_name".
TIPO DE ENTRADA
// Crear el tipo de entrada personalizado para noticias
register_post_type('nwcm_news', array(
'labels' => array(
'name' => __('Noticias para clientes', 'NWCM'),
'singular_name' => __('Noticia', 'NWCM'),
'menu_name' => __('NWCM', 'NWCM'),
'all_items' => __('Ver Artículos', 'NWCM'),
),
'public' => true,
'has_archive' => true,
'show_ui' => true,
'show_in_menu' => true,
'taxonomies' => array(
'nwcm_news_category'
)
));
TAXONOMÍA
// Registrar la taxonomía de noticias
register_taxonomy('nwcm_news_category', 'nwcm_news', array(
'label' => 'Categorías de Noticias',
'labels' => array(
'menu_name' => __('Categorías de Noticias', 'NWCM')
),
'rewrite' => array(
'slug' => 'categoria-noticias-nwcm'
),
'hierarchical' => true
));
No estoy 100% seguro si deseas tener tu propio menú de administración personalizado para agregar tus elementos o si solo quieres cambiar el nombre del menú del tipo de entrada personalizado.
He agregado el menu_name
como "NWCM" a las etiquetas de tu tipo de entrada personalizado.
Te recomiendo encarecidamente que leas y comprendas completamente los parámetros y argumentos para registrar tipos de entradas personalizados y taxonomías.
EDITADO: 09/05/2014
Si deseas agregar completamente tu propio menú de administración personalizado, y mezclar tus Tipos de Entradas Personalizados, Taxonomías Personalizadas y cualquier otra página de administración personalizada... La siguiente solución funciona. Ten en cuenta que es solo un punto de partida y no tienes que hacerlo exactamente así al 100%. Es solo un ejemplo... Te recomiendo que lo modifiques para que sea comprensible y mantenible por ti o tu desarrollador.
Enganchar a init
y registrar Tipos de Entradas Personalizados y Taxonomías Personalizadas.
if ( ! function_exists( 'mbe_init' ) ) {
function mbe_init() {
# Crear el tipo de entrada personalizado para noticias
register_post_type( 'nwcm_news', array(
'labels' => array(
'name' => __( 'Noticias para clientes', 'NWCM' ),
'singular_name' => __( 'Noticia', 'NWCM' ),
),
'public' => true,
'has_archive' => true,
'show_ui' => true,
'show_in_menu' => false,// agregando manualmente al menú personalizado
'taxonomies' => array(
'nwcm_news_category'
)
) );
# Crear la taxonomía personalizada de categorías de noticias
register_taxonomy( 'nwcm_news_category', 'nwcm_news', array(
'label' => 'Categorías de Noticias',
'labels' => array(
'menu_name' => __( 'Categorías de Noticias', 'NWCM' )
),
'rewrite' => array(
'slug' => 'categoria-noticias-nwcm'
),
'hierarchical' => true
) );
}
add_action( 'init', 'mbe_init' );
}
Enganchar a admin_menu
para crear un menú de administración personalizado padre, y agregar Páginas de Submenú de Administración Personalizadas, páginas de Tipo de Entrada Personalizado y páginas de Taxonomía Personalizada al menú de administración personalizado padre.
if ( ! function_exists( 'mbe_add_admin_menu' ) && ! function_exists( 'mbe_display_admin_page' ) ) {
function mbe_add_admin_menus() {
# Configuración para el menú de administración personalizado
$page_title = 'Noticias para clientes';
$menu_title = 'NWCM';
$capability = 'post';
$menu_slug = 'nwcm';
$function = 'mbe_display_admin_page';// Función de callback que muestra el contenido de la página.
$icon_url = 'dashicons-admin-page';
$position = 0;
# Agregar menú de administración personalizado
add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
$submenu_pages = array(
# Evitar páginas duplicadas. Agregar página de submenú con el mismo slug que el slug padre.
array(
'parent_slug' => 'nwcm',
'page_title' => 'Resumen de Noticias',
'menu_title' => 'Resumen',
'capability' => 'read',
'menu_slug' => 'nwcm',
'function' => 'mbe_display_admin_page',// Usa la misma función de callback que el menú padre.
),
# Tipo de Entrada :: Ver Todas las Entradas
array(
'parent_slug' => 'nwcm',
'page_title' => '',
'menu_title' => 'Ver Noticias',
'capability' => '',
'menu_slug' => 'edit.php?post_type=nwcm_news',
'function' => null,// No necesita una función de callback.
),
# Tipo de Entrada :: Agregar Nueva Entrada
array(
'parent_slug' => 'nwcm',
'page_title' => '',
'menu_title' => 'Agregar Noticia',
'capability' => '',
'menu_slug' => 'post-new.php?post_type=nwcm_news',
'function' => null,// No necesita una función de callback.
),
# Taxonomía :: Gestionar Categorías de Noticias
array(
'parent_slug' => 'nwcm',
'page_title' => '',
'menu_title' => 'Categorías de Noticias',
'capability' => '',
'menu_slug' => 'edit-tags.php?taxonomy=nwcm_news_category&post_type=nwcm_news',
'function' => null,// No necesita una función de callback.
),
);
# Agregar cada elemento de submenú al menú de administración personalizado.
foreach ( $submenu_pages as $submenu ) {
add_submenu_page(
$submenu['parent_slug'],
$submenu['page_title'],
$submenu['menu_title'],
$submenu['capability'],
$submenu['menu_slug'],
$submenu['function']
);
}
}
add_action( 'admin_menu', 'mbe_add_admin_menus', 1 );
/* Si agregas páginas de submenú personalizadas adicionales que no sean un Tipo de Entrada Personalizado o una Taxonomía Personalizada, necesitarás
* crear una función de callback para cada uno de los elementos de submenú personalizados que crees arriba.
*/
# Página de Administración Predeterminada para el Menú de Administración Personalizado
function mbe_display_admin_page() {
# Mostrar el contenido de la página de administración personalizada desde el menú de administración personalizado recién agregado.
echo '<div class="wrap">' . PHP_EOL;
echo '<h2>Título de Mi Página de Administración Personalizada</h2>' . PHP_EOL;
echo '<p>Esta es la página de administración personalizada creada desde el menú de administración personalizado.</p>' . PHP_EOL;
echo '</div><!-- end .wrap -->' . PHP_EOL;
echo '<div class="clear"></div>' . PHP_EOL;
}
}
Enganchar a parent_file
para resaltar correctamente los elementos de submenú de tu Tipo de Entrada Personalizado y Taxonomía Personalizada con tu menú/página padre personalizada.
if ( ! function_exists( 'mbe_set_current_menu' ) ) {
function mbe_set_current_menu( $parent_file ) {
global $submenu_file, $current_screen, $pagenow;
# Establecer el submenú como activo/actual mientras estés en cualquier parte de tu Tipo de Entrada Personalizado (nwcm_news)
if ( $current_screen->post_type == 'nwcm_news' ) {
if ( $pagenow == 'post.php' ) {
$submenu_file = 'edit.php?post_type=' . $current_screen->post_type;
}
if ( $pagenow == 'edit-tags.php' ) {
$submenu_file = 'edit-tags.php?taxonomy=nwcm_news_category&post_type=' . $current_screen->post_type;
}
$parent_file = 'nwcm';
}
return $parent_file;
}
add_filter( 'parent_file', 'mbe_set_current_menu' );
}
Si necesitas alguna aclaración sobre cómo funciona todo esto, lee las siguientes páginas de principio a fin.
- Agregar Menús de Administración Padre Personalizados
- Agregar Menús de Administración Hijo Personalizados
- Roles y Capacidades en WordPress
- Registrar Tipos de Entradas Personalizados
- Registrar Taxonomías Personalizadas
- API de Plugins de WordPress :: Referencia de Acciones
- API de Plugins de WordPress :: Referencia de Acciones ::
init
- API de Plugins de WordPress :: Referencia de Acciones ::
admin_menu
- API de Plugins de WordPress :: Referencia de Filtros
- Lista de Todos los Ganchos de WordPress (incluyendo acciones y filtros)

Desafortunadamente esto no es lo que necesito :( Ya revisé el codex y no habla sobre mi caso; Agregar un menú de taxonomía personalizada a un menú creado con "add_menu_page". El ejemplo que proporcionaste arriba no usa "add_menu_page" sino que simplemente crea un nuevo menú de nivel superior.. Por eso usé 'show_in_menu' => 'nwcm'
; Necesito que mi tipo de contenido personalizado + taxonomía asociada aparezcan bajo un menú creado usando add_menu_page
.. Esto es un poco complejo y no estoy seguro si es posible lograrlo.

@numediaweb Intenté por mucho tiempo pasar una cadena al argumento show_in_menu
para register_post_type();
como admin.php?page=nwcm
... Pero simplemente no funcionaba. Sin embargo, con mi solución, permite un poco más de flexibilidad y libertad en tu desarrollo de administración de WordPress. Puedes mezclar páginas personalizadas del admin, páginas de Tipos de Contenido personalizados y páginas de Taxonomías personalizadas. Mira la edición a mi respuesta. :)

Gracias Michael por el tiempo dedicado a la respuesta :) Bueno, aunque la solución que proporcionaste funcionará, tiene una desventaja; pierdes el "hook" o enlace de WordPress entre el tipo de contenido personalizado y el menú generado. Esto significa que cuando haces clic, por ejemplo, en "Agregar Noticia" te llevará a la página correcta pero el menú de la izquierda no se resaltará porque WordPress no conoce la conexión entre el tipo de contenido personalizado "nwcm_news" y el ítem "submenu_page".. Creo que lo que estoy intentando lograr es imposible.. ¡cambiaré mi enfoque! gracias

@numediaweb La otra opción que tienes es registrar tu Custom Post Type y tu Taxonomía personalizada. Vinculando los dos juntos bajo el mismo menú automáticamente. Luego, puedes agregar y personalizar páginas de administración como elementos de submenú bajo el menú de tu Custom Post Type. Básicamente, operando con una lógica inversa a lo que quieres hacer. Eso permitiría que los elementos de tu submenú se resalten correctamente.

@numediaweb Agregué una solución para resaltar correctamente los elementos de submenú de tu Custom Post Type y Taxonomía personalizada con tu página/menú de administración padre personalizado.

Así es como logré esto: Dentro de la acción admin_menu, agregué un ítem de submenú al menú padre ('nwcm') con el parámetro menu_slug configurado a la URL de la página de edición de taxonomía.
add_submenu_page('nwcm', 'Categorías de noticias', 'Categorías de noticias', 'edit_posts', 'edit-tags.php?taxonomy=nwcm_news&post_type=nwcm_news',false );

Muy ilustrativo que puedas usar la variable $menu_slug
para apuntar a donde quieras. Me registré aquí solo para poder votar tu respuesta.

¡Genial! ¡Exactamente lo que estaba buscando! El único inconveniente es que no mantiene ese submenú expandido cuando estás en esa página. No es un gran problema para mi caso.

¡Este es el que funciona! Solo una nota, cuando registras tu taxonomía normalmente lo enganchas a 'init', para editar la función add_submenu_page deberías engancharla a la función 'admin_menu' - algo así como add_action('admin_menu', function(){ add_submenu_page() } );

Existe el filtro parent_file que puede utilizarse para solucionar el problema de expansión del menú.
