@Dasslier
FrontEnd Developer

Почему пропадают ссылки в li и слетают настройки основного меню?

Настроил основное меню в WP при помощи register_nav_menu(), меню кастомизировал при помощи фильтров, вот код:
<?php

// Изменяем основные параметры main меню
add_filter( 'wp_nav_menu_args', 'filter_wp_menu_args' );
function filter_wp_menu_args( $args ) {
  if ( $args['theme_location'] === 'main') {
    $args['container'] = false;
    $args['items_wrap'] = '<ul class="%2$s">%3$s</ul>';
    $args['menu_class'] = 'menu-nav__list';
  }

  return $args;
}

// Изменяем атрибут id у тега li
add_filter( 'nav_menu_item_id', 'filter_menu_item_css_id', 10, 4 );
function filter_menu_item_css_id( $menu_id, $item, $args, $depth ) {
  return $args->theme_location === 'main' ? '' : $menu_id;
}

// Изменяем атрибут class у тега li
add_filter('nav_menu_css_class', 'filter_nav_menu_css_classes', 10, 4 );
function filter_nav_menu_css_classes( $classes, $item, $args, $depth) {
  if ( $args->theme_location === 'main') {
    if ( $depth === 0 ) {
      if ( in_array('menu-item-has-children', $classes ) ) {
        $classes = ['menu-nav__list-item', 'menu-item-has-children'];
      }
      $classes = ['menu-nav__list-item'];
    }
    if ( $depth === 1 ) {
      if ( in_array('menu-item-has-children', $classes ) ) {
        $classes = ['menu-nav__submenu-list-item', 'menu-item-has-children'];
      }
      $classes = ['menu-nav__submenu-list-item'];
    }
    if ( $depth === 2) {
      if ( in_array('menu-item-has-children', $classes ) ) {
        $classes = ['menu-nav__sub-submenu-item', 'menu-item-has-children'];
      }
      $classes = ['menu-nav__sub-submenu-item'];
    }

    return $classes;
  }
}

// Изменяем атрибут class у вложенного тега ul
add_filter( 'nav_menu_submenu_css_class', 'filter_nav_menu_submenu_css_class', 10, 3 );
function filter_nav_menu_submenu_css_class( $classes, $args, $depth) {
  if ( $args->theme_location === 'main') {
    if ( $depth === 0 ) {
      $classes = ['menu-nav__submenu-list'];
    }
    if ( $depth === 1 ) {
      $classes = ['menu-nav__sub-submenu'];
    }

    return $classes;
  }
}

// Изменяем атрибут class у ссылок в меню
add_filter( 'nav_menu_link_attributes', 'filter_nav_menu_link_attributes', 10, 4 );
function filter_nav_menu_link_attributes( $atts, $item, $args, $depth ) {
  if ( $args->theme_location === 'main' ) {
    if ( $depth === 0 ) {
      $atts['class'] = 'menu-nav__link';
      if ( $item->current) $atts['class'] .= ' menu-nav_active-link';
    }
    if ( $depth === 1 ) {
      $atts['class'] = 'menu-nav__submenu-link';
    }
    if ( $depth === 2 ) {
      $atts['class'] = 'menu-nav__sub-submenu-link';
    }

    return $atts;
  }
}

// Фильтр на метод класса
add_filter( 'walker_nav_menu_start_el', 'filter_nav_menu_arrow', 10, 4 );
function filter_nav_menu_arrow( $item_output, $item, $depth, $args = array() ){
  if ( $args->theme_location === 'main') {
    $classes = empty( $item->classes ) ? array() : (array) $item->classes;

    if ( in_array('menu-item-has-children', $classes ) ) {
      if ( $depth === 0 ) $item_output .= '<div class="menu-nav__arrow"></div>';
      if ( $depth === 1 ) $item_output .= '<div class="menu-nav__submenu-arrow"></div>';
    }

    return $item_output;
  }
}

// Добавляем поиск последним элементом меню
add_filter( 'wp_nav_menu_items', 'change_nav_menu_items', 10, 2 );

function change_nav_menu_items( $items, $args ) {
	if ( $args->theme_location === 'main' ) {
		$items .= '<li class="menu-nav__list-item"><img src="/wp-content/themes/amirdent/assets/img/system/search.svg" class="menu-nav__search-icon" alt="иконка лупы">' . get_search_form( false ) . '</li>';
	}

	return $items;
}


С этим все ок, работает как надо, но если я пытаюсь добавить второе/третье меню, то у меня слетают стили у основного меню и исчезают ссылки a href у второго меню.
Почему так происходит? И как сохранить стили основного меню, добавив второе, третье и тд?

Если подключаю второе меню, то меняю на register_nav_menus();, а сами меню подключаю в отдельных файлах
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
@Dasslier Автор вопроса
FrontEnd Developer
Нашел проблему сам. Ссылки пропадают из за того, что вызван фильтр
add_filter( 'walker_nav_menu_start_el', 'filter_nav_menu_arrow', 10, 4 );

Этот метод должен возвращать $item_output, а в моем случае - он возвращает $item_output только если меню типа 'main'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы