• I have 2 problems with my WordPress / WooCommerce Site.
    When I, for example, am in the category “Typography” and “Sort by newness” my main nav item loses the active class and my submenu disappears.

    Here I have an image when I am in the category “Typography” and everything works fine
    https://i.stack.imgur.com/Tpcbo.jpg

    and this is a screenshot when I “Sort by newness” and the submenu disappears
    https://i.stack.imgur.com/hP30o.jpg

    this is the walker Nav I am using for my main nav

        <?php
      
        class wp_bootstrap_navwalker extends Walker_Nav_Menu {
        
        
        	public $megaMenuID;
        	public $count;
        	public function __construct()
        	{
        			$this->megaMenuID = 0;
        			$this->count = 0;
        	}
        	public function start_lvl(&$output, $depth = 0, $args = array())
        	{
        			$indent = str_repeat("\t", $depth);
        			$submenu = ($depth > 0) ? ' sub-menu' : '';
        			$output .= "\n$indent<ul class=\"dropdown-menu$submenu depth_$depth\" >\n";
        			if ($this->megaMenuID != 0) {
        					$output .= "<li class=\"megamenu-column\"><ul>\n";
        			}
        
        	}
        	public function end_lvl(&$output, $depth = 0, $args = array())
        	{
        			if ($this->megaMenuID != 0) {
        					$output .= "</ul></li>";
        			}
        			$output .= "</ul>";
        	}
        	public function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0)
        	{
        			$indent = ($depth) ? str_repeat("\t", $depth) : '';
        			$li_attributes = '';
        			$class_names = $value = '';
        			$classes = empty($item->classes) ? array() : (array) $item->classes;
        
        			if ($this->megaMenuID != 0 && $this->megaMenuID === intval($item->menu_item_parent)) {
        
        			//		$this->count++;
        			//		if ($this->count > 4) {
        			//				$output .= "</ul></li><li class=\"megamenu-column\"><ul>\n";
        			//				$this->count = 1;
        			//		}
        			$column_divider = array_search('column-divider', $classes);
        			if ($column_divider !== false) {
        				$output .= "</ul></li><li class=\"megamenu-column\"><ul>\n";			}
        
        			} else {
        					$this->megaMenuID = 0;
        			}
        
        
        
        			// managing divider: add divider class to an element to get a divider before it.
        			$divider_class_position = array_search('divider', $classes);
        			if ($divider_class_position !== false) {
        					$output .= "<li class=\"divider\"></li>\n";
        					unset($classes[$divider_class_position]);
        			}
        
        
        			if (array_search('megamenu', $classes) !== false) {
        					$this->megaMenuID = $item->ID;
        			}
        			$classes[] = ($args->has_children) ? 'dropdown' : '';
        			$classes[] = ($item->current || $item->current_item_ancestor) ? 'active' : '';
        			$classes[] = 'menu-item-'.$item->ID;
        			if ($depth && $args->has_children) {
        					$classes[] = 'dropdown-submenu';
        			}
        			$class_names = implode(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item, $args));
        			$class_names = ' class="'.esc_attr($class_names).'"';
        			$id = apply_filters('nav_menu_item_id', 'menu-item-'.$item->ID, $item, $args);
        			$id = strlen($id) ? ' id="'.esc_attr($id).'"' : '';
        			$output .= $indent.'<li'.$id.$value.$class_names.$li_attributes.'>';
        			$attributes = !empty($item->attr_title) ? ' title="'.esc_attr($item->attr_title).'"' : '';
        			$attributes .= !empty($item->target) ? ' target="'.esc_attr($item->target).'"' : '';
        			$attributes .= !empty($item->xfn) ? ' rel="'.esc_attr($item->xfn).'"' : '';
        			$attributes .= !empty($item->url) ? ' href="'.esc_attr($item->url).'"' : '';
        			$attributes .= ($args->has_children) ? ' class="dropdown-toggle" data-toggle="dropdown"' : '';
        			$item_output = $args->before;
        			$item_output .= '<a'.$attributes.'>';
        
        
        			// Check if item has featured image
        			$has_featured_image = array_search('featured-image', $classes);
        			if ($has_featured_image !== false && $this->megaMenuID != 0) {
        					$postID = url_to_postid( $item->url );
        					$item_output .= "<div id=\"menu-image\"> <img class=\"lozad\" alt=\"" . esc_attr($item->attr_title) . "\" src=\"" . get_the_post_thumbnail_url( $postID, array(215, 320)) . "\"/></div>";
        			}
        
        			$item_output .= $args->link_before.apply_filters('the_title', $item->title, $item->ID).$args->link_after;
        					// add support for menu item title
        					if (strlen($item->attr_title) > 2) {
        							$item_output .= '<h3 class="tit">'.$item->attr_title.'</h3>';
        					}
        					// add support for menu item descriptions
        					if (strlen($item->description) > 2) {
        							$item_output .= '</a> <span class="sub">'.$item->description.'</span>';
        					}
        			$item_output .= (($depth == 0 || 1) && $args->has_children) ? ' <b class="caret"></b></a>' : '</a>';
        			$item_output .= $args->after;
        			$output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args);
        	}
        	public function display_element($element, &$children_elements, $max_depth, $depth, $args, &$output)
        	{
        			if (!$element) {
        					return;
        			}
        			$id_field = $this->db_fields['id'];
        			//display this element
        			if (is_array($args[0])) {
        					$args[0]['has_children'] = !empty($children_elements[$element->$id_field]);
        			} elseif (is_object($args[0])) {
        					$args[0]->has_children = !empty($children_elements[$element->$id_field]);
        			}
        			$cb_args = array_merge(array(&$output, $element, $depth), $args);
        			call_user_func_array(array(&$this, 'start_el'), $cb_args);
        			$id = $element->$id_field;
        			// descend only when the depth is right and there are childrens for this element
        			if (($max_depth == 0 || $max_depth > $depth + 1) && isset($children_elements[$id])) {
        					foreach ($children_elements[ $id ] as $child) {
        							if (!isset($newlevel)) {
        									$newlevel = true;
        						//start the child delimiter
        						$cb_args = array_merge(array(&$output, $depth), $args);
        									call_user_func_array(array(&$this, 'start_lvl'), $cb_args);
        							}
        							$this->display_element($child, $children_elements, $max_depth, $depth + 1, $args, $output);
        					}
        					unset($children_elements[ $id ]);
        			}
        			if (isset($newlevel) && $newlevel) {
        					//end the child delimiter
        				$cb_args = array_merge(array(&$output, $depth), $args);
        					call_user_func_array(array(&$this, 'end_lvl'), $cb_args);
        			}
        			//end this element
        			$cb_args = array_merge(array(&$output, $element, $depth), $args);
        			call_user_func_array(array(&$this, 'end_el'), $cb_args);
        	}
        
        
        
        }

    and this is the separate submenu nav I am using

          <?php
          $old_query = $wp_query;
          $wp_query = new WP_Query( array('post_type' => 'product') );
              wp_nav_menu( array( 'theme_location' => 'primary_navigation', 'sub_menu' => true ));
          $wp_query = $old_query;
          ?>
Viewing 1 replies (of 1 total)
  • Moderator bcworkz

    (@bcworkz)

    Sorry for a slow reply. If you still have not yet figured this out, I am suspecting a JavaScript error related to the newness sort order selection. If that causes an error, the menu script that inserts the active class will also fail to work. There may not be anything wrong with the menu script, it’s merely a victim of another script’s error.

    Does you browser console indicate any JavaScript errors?

Viewing 1 replies (of 1 total)
  • The topic ‘Menu losing active class and submenu disappears when orderby=date etc’ is closed to new replies.