chodorowicz
  • 0
Новичок

wp_nav_menu не создает классы родителей/предков

  • 0

Я не знаю, почему не генерируются правильные классы для пункта меню — все элементы в дереве, имеющем поддерево, получают только menu-item menu-item-type-post_type . Элементы, у которых нет дочерних элементов, получают соответствующие классы после нажатия (активны).

Ссылка: http://lichens.ie/

Часть структуры меню: http://imgur.com/5Lj00.png

Код

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

Когда вы посещаете, например, http://lichens.ie/view-lichens-by/lichens-by-habitat/, вы видите, что у него нет «текущего» класса. Как и его родитель.

PS Извините за публикацию «нерабочих ссылок» — это из-за ограничения репутации

Любые идеи — помощь высоко ценится.

Share
  1. Это часть кода _wp_menu_item_classes_by_context(), которая обрабатывает текущий класс для страниц:

    // 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. Идентификаторы должны совпадать.
    2. Он должен быть post_type типовым.
    3. Запрос должен быть для is_singular .

    Второй пункт можно исключить, т.к. класс CSS для типа элемента сгенерирован корректно. Так что что-то пойдет не так либо с идентификаторами, либо с is_singular условными.

    Вы запускаете какие-либо вторичные циклы на странице? Наиболее распространенной причиной нарушения условий является неправильное использование query_posts() .

    • 0
    • Ты был прав! Удивительно! Это не та тема, которую я подготовил (я просто делаю некоторые модификации, добавляя поддержку меню), и это было ошибкой дополнительных query_posts, которые использовались перед вызовом меню. Большое спасибо! Мне жаль, что я еще не могу проголосовать за ваш ответ

      • 0
    • Спасибо за предложение — к счастью, ответ от Rarst решил проблему (неправильное использование дополнительного цикла перед вызовом меню). Я сохраню фрагмент на будущее и проголосую за ваш ответ, когда у меня будет достаточно репутации. Приветствует.

      • 0
  2. Я не знаю, почему это не работает в вашем случае… Как вы говорите, активная страница должна добавлять «current_menu_item» к своим классам. Если у вас возникли проблемы по той или иной причине, вы всегда можете использовать фильтр nav_menu_css_class, чтобы добавить свои собственные классы. Этот небольшой фрагмент кода по существу дублирует классы current_menu_item и current_menu_parent и добавляет класс has_children (полезно для расширяемых или выпадающих меню):

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

    Конечно, вы хотите выяснить, почему встроенная функциональность не работает для вас, прежде чем что-то взломать, чтобы дублировать ее, но вы можете многое сделать с этим фильтром, если это необходимо…

    • 0

Оставить ответ

You must login to add an answer.