• jrad

    (@jrad)


    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.