Mostrar Taxonomía Personalizada Dentro del Menú Personalizado

4 sept 2014, 23:29:59
Vistas: 26.7K
Votos: 9

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

0
Todas las respuestas a la pregunta 2
6
20

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.

  1. Agregar Menús de Administración Padre Personalizados
  2. Agregar Menús de Administración Hijo Personalizados
  3. Roles y Capacidades en WordPress
  4. Registrar Tipos de Entradas Personalizados
  5. Registrar Taxonomías Personalizadas
  6. API de Plugins de WordPress :: Referencia de Acciones
  7. API de Plugins de WordPress :: Referencia de Acciones :: init
  8. API de Plugins de WordPress :: Referencia de Acciones :: admin_menu
  9. API de Plugins de WordPress :: Referencia de Filtros
  10. Lista de Todos los Ganchos de WordPress (incluyendo acciones y filtros)
5 sept 2014 01:21:00
Comentarios

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 numediaweb
5 sept 2014 13:49:48

@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. :)

Michael Ecklund Michael Ecklund
5 sept 2014 19:36:46

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 numediaweb
5 sept 2014 22:05:43

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

Michael Ecklund Michael Ecklund
5 sept 2014 23:02:13

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

Michael Ecklund Michael Ecklund
5 sept 2014 23:21:11

Explicación bastante sólida. Parent_file necesita algunos ajustes pero tiene casi todo lo necesario para resolver este problema.

GDY GDY
9 may 2022 13:08:16
Mostrar los 1 comentarios restantes
5
11

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 );
28 jul 2015 03:02:48
Comentarios

Respuesta muy precisa a la pregunta

richard muvirimi richard muvirimi
14 abr 2020 16:15:12

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

maganap maganap
27 abr 2020 17:43:34

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

Codesmith Codesmith
9 dic 2020 01:12:15

¡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() } );

PattyOK PattyOK
25 ago 2021 20:54:04

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

wrwrwr wrwrwr
2 may 2023 10:51:07