How to check if sub menu is on an active page?
-
I need to add some custom html to a sub menu ONLY if the page is an active page.
I’d like to do this with php and not css or javascript. I am using the Roots theme but this should work on any theme.If you look at function start_lvl this is the start of the sub menu ul tag. I need to add custom html on that but only on active pages. Is this possible?
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=\"sub-nav\">\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-target="#"', $item_html); $item_html = str_replace('</a>', '</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="dropdown-header')) { $item_html = preg_replace('/<a[^>]*>(.*)<\/a>/iU', '$1', $item_html); } $item_html = apply_filters('roots_wp_nav_menu_item', $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]) && (($depth + 1) < $max_depth || ($max_depth === 0)))); if ($element->is_dropdown) { $element->classes[] = 'dropdown'; } 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') && !$args['depth']) { $roots_nav_menu_args['depth'] = 2; } 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');
- The topic ‘How to check if sub menu is on an active page?’ is closed to new replies.