it-swarm.dev

wp_nav_menu negeneruje třídy rodič/předchůdce

Nevím, proč nejsou vytvořeny správné třídy pro položku menu - všechny prvky ve stromu, které mají podstrom, dostanou pouze menu-item menu-item-type-post_type. Prvky, které nemají děti, si po kliknutí kliknou (aktivní).

Odkaz: http://lichens.ie/

Část struktury menu: http://imgur.com/5Lj00.png

Kód

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

Když navštívíte např. http://lichens.ie/view-lichens-by/lichens-by-habitat/ můžete vidět, že nemá žádnou 'aktuální' třídu. Stejně jako je to rodič.

PS Omlouváme se za zaslání „nefungujících odkazů“ - je to kvůli omezení reputace

Nějaké nápady - pomoc velmi ocenil.

2
chodorowicz

Toto je část kódu v _wp_menu_item_classes_by_context(), která zpracovává aktuální třídu stránek:

// 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. ID musí odpovídat.
  2. Musí být typu post_type.
  3. Dotaz by měl být pro is_singular.

Druhý bod lze vyloučit, protože třída CSS pro typ položky je generována správně. Takže se něco pokazí buď s ID nebo is_singular podmíněným.

Používáte na stránce nějaké sekundární smyčky? Nejčastějším důvodem pro přerušení podmínek je nesprávné použití query_posts().

5
Rarst

Nevím, proč nefunguje ve vašem případě ... Jak říkáte, aktivní stránka by měla být přidána do aktuálních tříd. Pokud máte potíže z jednoho důvodu jiného, ​​můžete vždy použít filtr 'nav_menu_css_class' pro přidání vlastních tříd. Tento kousek kódu bude v podstatě duplikovat třídy 'current_menu_item' & 'current_menu_parent' a přidávat třídu 'has_children' (užitečné pro rozbalitelné nebo rozevírací nabídky):

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

Samozřejmě, že chcete zjistit, proč vestavěná funkce nefunguje pro vás před hacking něco, co duplikovat, ale můžete udělat hodně s tímto filtrem v případě potřeby ...

1
goldenapples