Elemento de menú activo de tipo de publicación personalizada

3 minutos de lectura

avatar de usuario
mariola

Creé un tipo de publicación personalizada llamada “equipo” y agregué el enlace a la página de archivo en el menú de WP. Una vez que el usuario hace clic en él, se le muestran todos los miembros del equipo y la página actual se resalta en el menú. Pero cuando hago clic en miembro individual del equipo, su página se abre y el “Equipo” en el menú ya no está resaltado, y debería estarlo.

Así es como aparece cuando se abre la página del equipo:

<li id="menu-item-17" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item active”>
<a href="http://localhost:8888/site/team/">Team</a>
</li>

y esto es lo que obtengo en el menú cuando abro la página de miembro individual:

<li id="menu-item-17" class="menu-item menu-item-type-custom menu-item-object-custom”>
<a href="http://localhost:8888/site/team/">Team</a>
</li>

Como no soy un desarrollador de PHP, no tengo ni idea de cómo hacer que funcione, cualquier sugerencia sería muy apreciada 🙂

avatar de usuario
gavin simpson

Conseguí que esto funcionara para mí, tomado y editado de, aquí. Donde tengo ‘bonsai’, cámbielo a su tipo de publicación personalizada. Donde puse ‘menu-item-299’, cámbielo a la identificación de su elemento de menú que desea mantener resaltado.

function change_page_menu_classes($menu)
{
    global $post;
    if (get_post_type($post) == 'bonsai')
    {
        $menu = str_replace( 'current-menu-item', '', $menu ); // remove all current_page_parent classes
        $menu = str_replace( 'menu-item-299', 'menu-item-299 current-menu-item', $menu ); // add the current_page_parent class to the page you want
    }
    return $menu;
}
add_filter( 'nav_menu_css_class', 'change_page_menu_classes', 10,2 );

Avíseme si tiene problemas, porque tal vez me afecten 🙂

  • Gracias por la rápida respuesta Gavin 🙂 Encontré algunos fragmentos pero ninguno de ellos funcionó en mi caso, lo probaré con este. No, no soy un desarrollador de PHP, creé los campos usando un complemento de tipos de WP siguiendo un tutorial en línea: D

    – Mariola

    25 de enero de 2015 a las 18:18

  • Ok, después de publicar mi respuesta, noté que los 2 sitios a los que agregué tipos de menú personalizados tenían el mismo problema. Así que lo solucioné :). Estoy actualizando mi respuesta.

    –Gavin Simpson

    25 de enero de 2015 a las 18:21

  • Simplemente copie y pegue el código anterior en un archivo ‘functions.php’ en la carpeta raíz de su tema, luego edítelo como se describe 🙂

    –Gavin Simpson

    25 de enero de 2015 a las 18:25

  • Sí, lo hice, cambié el tipo de publicación personalizada y la ID del menú, pero aún nada 🙁 i.imgur.com/wGEfEKE.png

    – Mariola

    25 de enero de 2015 a las 18:29

  • Woho 🙂 Funciona después de jugar con el menú y cambiarlo de ‘walker’ => new Bootstrap_walker() a ‘walker’ => ” (funciona bien, así que supongo que esto no será un problema) Creé otra regla para otro tipo de publicación (pastebin.com/ytk4S4Ej) ¿Es esta una buena manera de hacerlo? Y una vez más, ¡muchas gracias! 🙂

    – Mariola

    25/01/2015 a las 20:33


Se puede hacer con un filtro muy simple en functions.php asegúrese de haber usado el argumento has_archive => true al registrar CPT o usar register_post_type()

//ADDING AN ACTIVE CLASS TO THE CUSTOM POST-TYPE MENU ITEM WHEN VISITING ITS SINGLE POST PAGES
function custom_active_item_classes($classes = array(), $menu_item = false){            
        global $post;

        $classes[] = ($menu_item->url == get_post_type_archive_link($post->post_type)) ? 'current-menu-item active' : '';
        return $classes;
    }
add_filter( 'nav_menu_css_class', 'custom_active_item_classes', 10, 2 );

Espero que esto ayude a alguien, comenta y vota si te ayuda.

  • ¡Esta es una solución increíble! gracias 🙂

    – Tatof

    6 de diciembre de 2021 a las 16:42

  • @Tatof, sí, es increíble 🙂 Gracias

    –Ibnul Hasan

    7 de diciembre de 2021 a las 3:40

Manera más simple sin get_post_type_archive_link función:

function custom_active_item_classes( $classes = [], $menu_item = false ) {
    global $post;

    $classes[] = ( in_array( 'menu-item-object-' . $post->post_type, $classes ) ) ? 'current-menu-item active' : '';

    return $classes;
}

add_filter( 'nav_menu_css_class', 'custom_active_item_classes', 10, 2 );

¿Ha sido útil esta solución?