Добавить родительский класс в родительские пункты меню

Есть ли хороший способ добавить класс «родительский» к списку элементов, у которых есть дети, используя wp_nav_menu?

Я нашел пару решений онлайн, но, похоже, не имел желаемого эффекта.

Solutions Collecting From Web of "Добавить родительский класс в родительские пункты меню"

Это не может быть идеальным решением, в зависимости от того, для чего вам нужен класс, но вы можете добавить «родительский» класс через JavaScript. В приведенной ниже строке используется переключатель jQuery :has() :

 $('#nav-id').find('li:has(ul)').addClass('parent'); 

См. WordPress codex http://codex.wordpress.org/Function_Reference/wp_nav_menu#How_to_add_a_parent_class_for_menu_item

Используйте эту функцию:

 add_filter('wp_nav_menu_objects', function ($items) { $hasSub = function ($menu_item_id, &$items) { foreach ($items as $item) { if ($item->menu_item_parent && $item->menu_item_parent==$menu_item_id) { return true; } } return false; }; foreach ($items as &$item) { if ($hasSub($item->ID, &$items)) { $item->classes[] = 'menu-parent-item'; // all elements of field "classes" of a menu item get join together and render to class attribute of 
  • элемент в HTML } } return $ items; });
  • Вы можете сделать это с небольшим количеством регулярных выражений и пользовательского ходунга, хотя я не тестировал это полностью:

     class My_Walker_Nav_Menu extends Walker_Nav_Menu { function start_lvl(&$output, $depth) { $indent = str_repeat("\t", $depth); $output = preg_replace( "/(.*)(\<li.*?class\=\")([^\"]*)(\".*?)$/", "$1$2$3 has-submenu$4", $output ); $output .= "\n$indent<ul class=\"sub-menu\">\n"; } } 

    Это происходит каждый раз, когда мы начинаем новый уровень в меню, мы смотрим на последнее открытие <li> в строке и добавляем «has-submenu» к атрибуту class. К сожалению, во время создания элемента списка мы не знаем, есть ли у него дети или нет.

    Чтобы использовать приведенное выше, просто перейдите в аргумент walker, где вы объявляете свое меню, например:

     wp_nav_menu( array( 'theme_location' => 'header', 'walker' => new My_Walker_Nav_Menu() ) );