I have a custom walker menu.( See the code below)
I would like to have my nav menu like this
---------------------------------- Home | link1 | link2 | link3 (5) ---------------------------------- Where 5 is the children count of link3.
Can someone help me to implement this?
Here is my current custom nav walker code.
<?php /** * Cleaner walker for wp_nav_menu() * * Walker_Nav_Menu (WordPress default) example output: * <li id="menu-item-8" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-8"><a href="/">Home</a></li> * <li id="menu-item-9" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9"><a href="/sample-page/">Sample Page</a></l * * Roots_Nav_Walker example output: * <li class="menu-home"><a href="/">Home</a></li> * <li class="menu-sample-page"><a href="/sample-page/">Sample Page</a></li> */ class Roots_Nav_Walker extends Walker_Nav_Menu { function check_current($classes) { return preg_match('/(current[-_])|active|dropdown/', $classes); } function start_lvl(&$output, $depth = 0, $args = array()) { $output .= "\n<ul class=\"dropdown-menu\">\n"; } function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) { $item_html = ''; parent::start_el($item_html, $item, $depth, $args); if ($item->is_dropdown && ($depth === 0)) { $item_html = str_replace('<a', '<a class="dropdown-toggle" data-toggle="dropdown" data-target="#"', $item_html); $item_html = str_replace('</a>', ' <b class="caret"></b></a>', $item_html); } elseif (stristr($item_html, 'li class="divider')) { $item_html = preg_replace('/<a[^>]*>.*?<\/a>/iU', '', $item_html); } elseif (stristr($item_html, 'li class="nav-header')) { $item_html = preg_replace('/<a[^>]*>(.*)<\/a>/iU', '$1', $item_html); } $output .= $item_html; } function display_element($element, &$children_elements, $max_depth, $depth = 0, $args, &$output) { $element->is_dropdown = !empty($children_elements[$element->ID]); if ($element->is_dropdown) { if ($depth === 0) { $element->classes[] = 'dropdown'; } elseif ($depth === 1) { $element->classes[] = 'dropdown-submenu'; } } parent::display_element($element, $children_elements, $max_depth, $depth, $args, $output); } } /** * Remove the id="" on nav menu items * Return 'menu-slug' for nav menu classes */ function roots_nav_menu_css_class($classes, $item) { $slug = sanitize_title($item->title); $classes = preg_replace('/(current(-menu-|[-_]page[-_])(item|parent|ancestor))/', 'active', $classes); $classes = preg_replace('/^((menu|page)[-_\w+]+)+/', '', $classes); $classes[] = 'menu-' . $slug; $classes = array_unique($classes); return array_filter($classes, 'is_element_empty'); } add_filter('nav_menu_css_class', 'roots_nav_menu_css_class', 10, 2); add_filter('nav_menu_item_id', '__return_null'); /** * Clean up wp_nav_menu_args * * Remove the container * Use Roots_Nav_Walker() by default */ function roots_nav_menu_args($args = '') { $roots_nav_menu_args['container'] = false; if (!$args['items_wrap']) { $roots_nav_menu_args['items_wrap'] = '<ul class="%2$s">%3$s</ul>'; } if (current_theme_supports('bootstrap-top-navbar')) { $roots_nav_menu_args['depth'] = 3; } if (!$args['walker']) { $roots_nav_menu_args['walker'] = new Roots_Nav_Walker(); } return array_merge($args, $roots_nav_menu_args); } add_filter('wp_nav_menu_args', 'roots_nav_menu_args');
$itemvia$item->has_childrenbut you can't find out how many children it has? Would be nice to know this without having to load up nav menu functions that will cause extra burden within thestart_elfunction, since everything should be known about the menu at that point already!$args->has_children. In any case, if you can find out that it has children, why can't we know how many children it has?