diff --git a/includes/walkers/class-product-cat-list-walker.php b/includes/walkers/class-product-cat-list-walker.php index d7b2576351c..230b04925a1 100644 --- a/includes/walkers/class-product-cat-list-walker.php +++ b/includes/walkers/class-product-cat-list-walker.php @@ -117,45 +117,42 @@ class WC_Product_Cat_List_Walker extends Walker { if ( !$element ) return; - if ( ! $args[0]['show_children_only'] || ( $args[0]['show_children_only'] && ( $element->parent == 0 || $args[0]['current_category'] == $element->parent || in_array( $element->parent, $args[0]['current_category_ancestors'] ) ) ) ) { + $id_field = $this->db_fields['id']; - $id_field = $this->db_fields['id']; + //display this element + if ( is_array( $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); - //display this element - if ( is_array( $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; - $id = $element->$id_field; + // descend only when the depth is right and there are children for this element + if ( ($max_depth == 0 || $max_depth > $depth+1 ) && isset( $children_elements[$id]) ) { - // descend only when the depth is right and there are children for this element - if ( ($max_depth == 0 || $max_depth > $depth+1 ) && isset( $children_elements[$id]) ) { + foreach( $children_elements[ $id ] as $child ){ - 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 ); + 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); } - unset( $children_elements[ $id ] ); + $this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output ); } - - 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); - + 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); + } } \ No newline at end of file diff --git a/includes/widgets/class-wc-widget-product-categories.php b/includes/widgets/class-wc-widget-product-categories.php index e9553ef63da..9f3421f4c4e 100644 --- a/includes/widgets/class-wc-widget-product-categories.php +++ b/includes/widgets/class-wc-widget-product-categories.php @@ -75,6 +75,8 @@ class WC_Widget_Product_Categories extends WC_Widget { public function widget( $args, $instance ) { extract( $args ); + global $wp_query, $post, $woocommerce; + $title = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base ); $c = ( isset( $instance['count'] ) && $instance['count'] ) ? '1' : '0'; $h = $instance['hierarchical'] ? true : false; @@ -86,30 +88,70 @@ class WC_Widget_Product_Categories extends WC_Widget { if ( $title ) echo $before_title . $title . $after_title; - + + $dropdown_args = array(); $cat_args = array( 'show_count' => $c, 'hierarchical' => $h, 'taxonomy' => 'product_cat' ); + // Menu Order $cat_args['menu_order'] = false; - if ( $o == 'order' ) { - $cat_args['menu_order'] = 'asc'; - } else { - $cat_args['orderby'] = 'title'; + } + + // Setup Current Category + $this->current_cat = false; + $this->cat_ancestors = array(); + + if ( is_tax('product_cat') ) { + + $this->current_cat = $wp_query->queried_object; + $this->cat_ancestors = get_ancestors( $this->current_cat->term_id, 'product_cat' ); + + } elseif ( is_singular('product') ) { + + $product_category = wc_get_product_terms( $post->ID, 'product_cat', array( 'orderby' => 'parent' ) ); + + if ( $product_category ) { + $this->current_cat = end( $product_category ); + $this->cat_ancestors = get_ancestors( $this->current_cat->term_id, 'product_cat' ); + } } + + // Show Siblings and Children Only + if ( $s && $this->current_cat ) { + + if ( $this->current_cat->parent == 0 ) { + $category_children = $this->current_cat->term_id; + } else { + $category_children = $this->current_cat->parent; + } + + $current_category_children = get_term_children( $category_children, 'product_cat' ); + + if ( $current_category_children ) { + $current_category_children = implode ( ", ", $current_category_children ); + $dropdown_args['include'] = $current_category_children; + $cat_args['include'] = $current_category_children; + } + + } + // Dropdown if ( $d ) { - // Stuck with this until a fix for http://core.trac.wordpress.org/ticket/13258 - wc_product_dropdown_categories( array( + $dropdown_defaults = array( 'show_counts' => $c, 'hierarchical' => $h, 'show_uncategorized' => 0, 'orderby' => $o - ) ); + ); + $dropdown_args = wp_parse_args( $dropdown_args, $dropdown_defaults ); + + // Stuck with this until a fix for http://core.trac.wordpress.org/ticket/13258 + wc_product_dropdown_categories( $dropdown_args ); ?> current_cat = false; - $this->cat_ancestors = array(); - - if ( is_tax('product_cat') ) { - - $this->current_cat = $wp_query->queried_object; - $this->cat_ancestors = get_ancestors( $this->current_cat->term_id, 'product_cat' ); - - } elseif ( is_singular('product') ) { - - $product_category = wc_get_product_terms( $post->ID, 'product_cat', array( 'orderby' => 'parent' ) ); - - if ( $product_category ) { - $this->current_cat = end( $product_category ); - $this->cat_ancestors = get_ancestors( $this->current_cat->term_id, 'product_cat' ); - } - - } - include_once( WC()->plugin_path() . '/includes/walkers/class-product-cat-list-walker.php' ); $cat_args['walker'] = new WC_Product_Cat_List_Walker; $cat_args['title_li'] = ''; - $cat_args['show_children_only'] = ( isset( $instance['show_children_only'] ) && $instance['show_children_only'] ) ? 1 : 0; $cat_args['pad_counts'] = 1; $cat_args['show_option_none'] = __('No product categories exist.', 'woocommerce' ); $cat_args['current_category'] = ( $this->current_cat ) ? $this->current_cat->term_id : '';