wp_nav_menu no genera clases padre / ancestro

2

No sé por qué no se generan las clases adecuadas para el elemento de menú: todos los elementos en el árbol que tiene el subárbol obtienen solo menu-item menu-item-type-post_type . Los elementos, que no tienen hijos, obtienen clases adecuadas después de hacer clic (activo).

Enlace: enlace

Parte de la estructura del menú: enlace

Código

$args = array(
    'menu'      => 'Main menu',
    'container' => '',
    'menu_id'   => 'nav',
);
wp_nav_menu($args);

Cuando visitas e.g. enlace puede ver que no tiene una clase 'actual'. Así como su padre.

Perdón por la publicación 'no funcionan los enlaces' - es debido a la limitación de reputación

Cualquier idea - ayuda muy apreciada.

    
pregunta chodorowicz 15.10.2010 - 01:00

2 respuestas

5

Esto es parte del código en _wp_menu_item_classes_by_context() que maneja la clase actual para las páginas:

// if the menu item corresponds to the currently-queried post or taxonomy object
} elseif (
    $menu_item->object_id == $queried_object_id &&
    (
        ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && $wp_query->is_home && $home_page_id == $menu_item->object_id ) ||
        ( 'post_type' == $menu_item->type && $wp_query->is_singular ) ||
        ( 'taxonomy' == $menu_item->type && ( $wp_query->is_category || $wp_query->is_tag || $wp_query->is_tax ) )
    )
) {
    $classes[] = 'current-menu-item';
  1. Las ID deben coincidir.
  2. Debe ser de tipo post_type .
  3. La consulta debe ser para is_singular .

El segundo punto se puede excluir, porque la clase CSS para el tipo de elemento se genera correctamente. Entonces, algo sale mal, ya sea con ID o is_singular condicional.

¿Está ejecutando bucles secundarios en la página? La razón más común para que se rompan los condicionales es el uso incorrecto de query_posts() .

    
respondido por el Rarst 15.10.2010 - 08:05
1

No sé por qué no funciona en su caso ... Como usted dice, la página activa debería estar agregando 'current_menu_item' a sus clases. Si tiene problemas por alguna razón, siempre puede usar el filtro 'nav_menu_css_class' para agregar sus propias clases. Este pequeño fragmento de código esencialmente duplicará el 'current_menu_item' & Clases 'current_menu_parent', y agrega una clase 'has_children' (útil para menús desplegables o desplegables):

function check_for_submenu($classes, $item) {
    global $wpdb, $post;
    if ($item->ID == $post->ID) array_push($classes,'current_menu_item');
    $has_children = $wpdb->get_var("SELECT COUNT(meta_id) FROM wp_postmeta WHERE meta_key='_menu_item_menu_item_parent' AND meta_value='".$item->ID."'");
    if ($has_children > 0) {
        array_push($classes,'has_children');
        $child_pages = $wpdb->get_col("SELECT c.meta_value FROM wp_postmeta AS c, wp_postmeta AS th 
                                      WHERE c.meta_key = '_menu_item_object_id' AND c.post_id = th.metavalue 
                                      AND th.meta_key= '_menu_item_menu_item_parent' AND th.post_id = {$item->ID}");
        if (in_array($post->ID,$child_pages)) array_push($classes,'current_menu_parent');
    }
    return $classes;
}

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

Por supuesto que quiere averiguar por qué la funcionalidad incorporada no funciona para usted antes de piratear algo para duplicarlo, pero puede hacer mucho con ese filtro si es necesario ...

    
respondido por el goldenapples 15.10.2010 - 07:00

Lea otras preguntas en las etiquetas