wp_nav_menu не генерирует родительские / предковые классы

wordpress.stackexchange https://wordpress.stackexchange.com/questions/2913

  •  16-10-2019
  •  | 
  •  

Вопрос

Я не знаю, почему соответствующие классы для пункта меню не генерируются - все элементы в дереве, которое имеет поддерево, получают только 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 Извините за публикацию "нерабочих ссылок" - это из-за ограничения репутации

Любые идеи - помощь очень ценится.

Это было полезно?

Решение

Это часть кода в _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().

Другие советы

Я не знаю, почему это не работает в вашем случае...Как вы сказали, активная страница должна добавлять '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);

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top