From 2fa6a9313dead3c15027f74fbdb4efdd2c107666 Mon Sep 17 00:00:00 2001 From: Coen Jacobs Date: Thu, 5 Apr 2012 10:34:11 +0200 Subject: [PATCH 1/5] Check if weight and dimension fields should be shown before checking values. Closes #892 --- templates/single-product/tabs/tab-attributes.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/templates/single-product/tabs/tab-attributes.php b/templates/single-product/tabs/tab-attributes.php index 7f871e24073..2cfa6974906 100644 --- a/templates/single-product/tabs/tab-attributes.php +++ b/templates/single-product/tabs/tab-attributes.php @@ -1,5 +1,10 @@ has_attributes() || $product->has_dimensions() || $product->has_weight()) : ?> -
  • - \ No newline at end of file +if ( get_option('woocommerce_enable_dimension_product_attributes') == 'yes' ) { + if ( $product->has_attributes() || $product->has_dimensions() || $product->has_weight() ) { + ?> +
  • + \ No newline at end of file From 57570b62c1625ce607b457eb137012290a02bec1 Mon Sep 17 00:00:00 2001 From: Coen Jacobs Date: Thu, 5 Apr 2012 10:46:39 +0200 Subject: [PATCH 2/5] Last commit was a bit rude. Also hide panels containing the data. Closes #892 --- templates/single-product/tabs/attributes.php | 9 +++++++-- templates/single-product/tabs/tab-attributes.php | 12 ++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/templates/single-product/tabs/attributes.php b/templates/single-product/tabs/attributes.php index ef8c6a1f907..21d841c1bd1 100644 --- a/templates/single-product/tabs/attributes.php +++ b/templates/single-product/tabs/attributes.php @@ -5,7 +5,10 @@ global $woocommerce, $post, $product; -if ($product->has_attributes() || $product->has_dimensions() || $product->has_weight()) : ?> +$show_attr = ( get_option( 'woocommerce_enable_dimension_product_attributes' ) == 'yes' ? true : false ); + +if ( $product->has_attributes() || ( $show_attr && $product->has_dimensions() ) || ( $show_attr && $product->has_weight() ) ) { + ?>
    @@ -15,4 +18,6 @@ if ($product->has_attributes() || $product->has_dimensions() || $product->has_we list_attributes(); ?>
    - \ No newline at end of file + \ No newline at end of file diff --git a/templates/single-product/tabs/tab-attributes.php b/templates/single-product/tabs/tab-attributes.php index 2cfa6974906..cc36bb3e02c 100644 --- a/templates/single-product/tabs/tab-attributes.php +++ b/templates/single-product/tabs/tab-attributes.php @@ -1,10 +1,10 @@ has_attributes() || $product->has_dimensions() || $product->has_weight() ) { - ?> -
  • - has_attributes() || ( $show_attr && $product->has_dimensions() ) || ( $show_attr && $product->has_weight() ) ) { + ?> +
  • + \ No newline at end of file From 2feb780a32508557d99f117e405c9974a8a0041b Mon Sep 17 00:00:00 2001 From: Coen Jacobs Date: Thu, 5 Apr 2012 11:14:23 +0200 Subject: [PATCH 3/5] Readme bump for #892 fix --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index 7acc48111e8..2cf70d4ba2e 100644 --- a/readme.txt +++ b/readme.txt @@ -149,6 +149,7 @@ Yes you can! Join in on our [GitHub repository](http://github.com/woothemes/wooc * Tweak - Don't send password in new account email (some customers complained/privacy concerns) * Tweak - Don't show unused tabs on the frontend (description and reviews) * Tweak - Rename comments meta box to reviews +* Fix - Do not show the Additional Information tab on product single page if contents are hidden or not existing. * Localization - Canada post code locale * Localization - RMB paypal * Localization - Bundled translation updates From 592037a193403b333b6be6500d48f7c284c330e2 Mon Sep 17 00:00:00 2001 From: Coen Jacobs Date: Thu, 5 Apr 2012 17:29:22 +0200 Subject: [PATCH 4/5] Filter available shipping methods. Closes #897 --- classes/shipping/class-wc-shipping.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/shipping/class-wc-shipping.php b/classes/shipping/class-wc-shipping.php index 1dec54cee29..5caf70f85b9 100644 --- a/classes/shipping/class-wc-shipping.php +++ b/classes/shipping/class-wc-shipping.php @@ -87,7 +87,7 @@ class WC_Shipping { endforeach; - return $_available_methods; + return apply_filters( 'woocommerce_available_shipping_methods', $_available_methods ); endif; } From 86c8da61891521e978e07e172dbb05b21525ae7b Mon Sep 17 00:00:00 2001 From: Mike Jolley Date: Thu, 5 Apr 2012 17:51:28 +0100 Subject: [PATCH 5/5] New walkers. Closes #891. --- .../writepanels/writepanel-order_data.php | 4 +- .../class-product-cat-dropdown-walker.php | 39 +++++ .../walkers/class-product-cat-list-walker.php | 151 ++++++++++++++++++ readme.txt | 3 +- widgets/widget-product_categories.php | 109 ++----------- woocommerce-core-functions.php | 43 ++--- 6 files changed, 222 insertions(+), 127 deletions(-) create mode 100644 classes/walkers/class-product-cat-dropdown-walker.php create mode 100644 classes/walkers/class-product-cat-list-walker.php diff --git a/admin/post-types/writepanels/writepanel-order_data.php b/admin/post-types/writepanels/writepanel-order_data.php index 331746bfa5b..d81c18eb327 100644 --- a/admin/post-types/writepanels/writepanel-order_data.php +++ b/admin/post-types/writepanels/writepanel-order_data.php @@ -217,7 +217,7 @@ function woocommerce_order_data_meta_box($post) { if ($order->get_formatted_shipping_address()) echo '

    '.__('Address', 'woocommerce').':
    ' .$order->get_formatted_shipping_address().'

    '; else echo '

    '.__('Address', 'woocommerce').': ' . __('No shipping address set.', 'woocommerce') . '

    '; - foreach ( $shipping_data as $key => $field ) : if (isset($field['show']) && !$field['show']) continue; + if ( $shipping_data ) foreach ( $shipping_data as $key => $field ) : if (isset($field['show']) && !$field['show']) continue; $field_name = 'shipping_'.$key; if ( $order->$field_name ) echo '

    '.$field['label'].': '.$order->$field_name.'

    '; endforeach; @@ -227,7 +227,7 @@ function woocommerce_order_data_meta_box($post) { // Display form echo '

    '; - foreach ( $shipping_data as $key => $field ) : + if ( $shipping_data ) foreach ( $shipping_data as $key => $field ) : if (!isset($field['type'])) $field['type'] = 'text'; switch ($field['type']) { case "select" : diff --git a/classes/walkers/class-product-cat-dropdown-walker.php b/classes/walkers/class-product-cat-dropdown-walker.php new file mode 100644 index 00000000000..838e0bd06e8 --- /dev/null +++ b/classes/walkers/class-product-cat-dropdown-walker.php @@ -0,0 +1,39 @@ + 'parent', 'id' => 'term_id', 'slug' => 'slug' ); + + /** + * @see Walker::start_el() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $category Category data object. + * @param int $depth Depth of category in reference to parents. + * @param array $args + */ + function start_el(&$output, $cat, $depth, $args) { + $pad = str_repeat(' ', $depth * 3); + + $cat_name = apply_filters( 'list_product_cats', $cat->name, $cat ); + $output .= "\t\n"; + } +} \ No newline at end of file diff --git a/classes/walkers/class-product-cat-list-walker.php b/classes/walkers/class-product-cat-list-walker.php new file mode 100644 index 00000000000..2bce5c12cb3 --- /dev/null +++ b/classes/walkers/class-product-cat-list-walker.php @@ -0,0 +1,151 @@ + 'parent', 'id' => 'term_id', 'slug' => 'slug' ); + + /** + * @see Walker::start_lvl() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of category. Used for tab indentation. + * @param array $args Will only append content if style argument value is 'list'. + */ + function start_lvl( &$output, $depth, $args ) { + if ( 'list' != $args['style'] ) + return; + + $indent = str_repeat("\t", $depth); + $output .= "$indent
      \n"; + } + + /** + * @see Walker::end_lvl() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of category. Used for tab indentation. + * @param array $args Will only append content if style argument value is 'list'. + */ + function end_lvl( &$output, $depth, $args ) { + if ( 'list' != $args['style'] ) + return; + + $indent = str_repeat("\t", $depth); + $output .= "$indent
    \n"; + } + + /** + * @see Walker::start_el() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $category Category data object. + * @param int $depth Depth of category in reference to parents. + * @param array $args + */ + function start_el( &$output, $cat, $depth, $args ) { + + $output .= '
  • ' . $cat->name . ''; + + if ( $args['show_count'] ) + $output .= ' (' . $cat->count . ')'; + + } + + /** + * @see Walker::end_el() + * @since 2.1.0 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $page Not used. + * @param int $depth Depth of category. Not used. + * @param array $args Only uses 'list' for whether should append to output. + */ + function end_el( &$output, $cat, $depth, $args ) { + + $output .= "
  • \n"; + + } + + /** + * Traverse elements to create list from elements. + * + * Display one element if the element doesn't have any children otherwise, + * display the element and its children. Will only traverse up to the max + * depth and no ignore elements under that depth. It is possible to set the + * max depth to include all depths, see walk() method. + * + * This method shouldn't be called directly, use the walk() method instead. + * + * @since 2.5.0 + * + * @param object $element Data object + * @param array $children_elements List of elements to continue traversing. + * @param int $max_depth Max depth to traverse. + * @param int $depth Depth of current element. + * @param array $args + * @param string $output Passed by reference. Used to append additional content. + * @return null Null on failure with no changes to parameters. + */ + function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) { + + 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']; + + //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; + + // 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); + + } + } + +} \ No newline at end of file diff --git a/readme.txt b/readme.txt index 2cf70d4ba2e..c98c8773eac 100644 --- a/readme.txt +++ b/readme.txt @@ -145,10 +145,11 @@ Yes you can! Join in on our [GitHub repository](http://github.com/woothemes/wooc = 1.5.4 = * Feature - Allow external products to be a part of a grouped product. Button titles will be respected when displayed. -* Tweaked - For the short description, removed the_content filter and used woocommerce_short_description +* Tweak - For the short description, removed the_content filter and used woocommerce_short_description * Tweak - Don't send password in new account email (some customers complained/privacy concerns) * Tweak - Don't show unused tabs on the frontend (description and reviews) * Tweak - Rename comments meta box to reviews +* Tweak - Rewritten widgets to use category walkers * Fix - Do not show the Additional Information tab on product single page if contents are hidden or not existing. * Localization - Canada post code locale * Localization - RMB paypal diff --git a/widgets/widget-product_categories.php b/widgets/widget-product_categories.php index 59bea5fd21f..e1b7d241fc5 100644 --- a/widgets/widget-product_categories.php +++ b/widgets/widget-product_categories.php @@ -78,26 +78,19 @@ class WooCommerce_Widget_Product_Categories extends WP_Widget { current_cat = false; $this->cat_ancestors = array(); - if (is_tax('product_cat')) : + 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')) : + elseif ( is_singular('product') ) : $product_category = wp_get_post_terms( $post->ID, 'product_cat' ); @@ -107,97 +100,27 @@ class WooCommerce_Widget_Product_Categories extends WP_Widget { endif; endif; - + + include_once( $woocommerce->plugin_path() . '/classes/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'] = ( $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 : ''; + $cat_args['current_category_ancestors'] = $this->cat_ancestors; + echo '
      '; - foreach ($cats as $cat) : - - // Only show top level for now - if ($cat->parent) continue; - - echo '
    • '.$cat->name.''; - - if ($c) echo ' ('.$cat->count.')'; - - if ( is_tax('product_cat', $cat->slug) || (in_array( $cat->term_id, $this->cat_ancestors ))) : - - $children = $this->get_children_cats( $cat->term_id ); - - $this->output_children_cats( $children, $c ); - - endif; - - echo '
    • '; - - endforeach; + wp_list_categories( apply_filters( 'woocommerce_product_categories_widget_args', $cat_args ) ); echo '
    '; - - } else { - echo '
      '; - - $cat_args['title_li'] = ''; - - wp_list_categories( apply_filters('woocommerce_product_categories_widget_args', $cat_args) ); - - echo '
    '; } echo $after_widget; } - - function get_children_cats( $parent ) { - $cat_args = array(); - - $cat_args['title_li'] = ''; - $cat_args['hierarchical'] = true; - $cat_args['child_of'] = 0; - $cat_args['pad_counts'] = 1; - $cat_args['parent'] = $parent; - - return get_terms( 'product_cat', apply_filters('woocommerce_product_categories_widget_subcat_args', $cat_args) ); - } - - function output_children_cats( $children, $c ) { - - echo '
      '; - - foreach ($children as $child) { - - echo '
    • '.$child->name.''; - - if ($c) echo ' ('.$child->count.')'; - - if ( is_tax('product_cat', $child->slug) || (in_array( $child->term_id, $this->cat_ancestors ))) { - - $children_children = $this->get_children_cats( $child->term_id ); - - if ($children_children) $this->output_children_cats( $children_children, $c ); - - } - - echo '
    • '; - } - - echo '
    '; - } /** @see WP_Widget->update */ function update( $new_instance, $old_instance ) { diff --git a/woocommerce-core-functions.php b/woocommerce-core-functions.php index b252976729d..4aded44b9b8 100644 --- a/woocommerce-core-functions.php +++ b/woocommerce-core-functions.php @@ -642,19 +642,22 @@ function woocommerce_terms_clauses($clauses, $taxonomies, $args ) { * WooCommerce Dropdown categories * * Stuck with this until a fix for http://core.trac.wordpress.org/ticket/13258 - * We use a custom walker, just like WordPress does it + * We use a custom walker, just like WordPress does */ function woocommerce_product_dropdown_categories( $show_counts = 1, $hierarchal = 1 ) { - global $wp_query; + global $wp_query, $woocommerce; + + include_once( $woocommerce->plugin_path() . '/classes/walkers/class-product-cat-dropdown-walker.php' ); $r = array(); - $r['pad_counts'] = 1; - $r['hierarchal'] = $hierarchal; - $r['hide_empty'] = 1; - $r['show_count'] = 1; - $r['selected'] = (isset($wp_query->query['product_cat'])) ? $wp_query->query['product_cat'] : ''; + $r['pad_counts'] = 1; + $r['hierarchal'] = $hierarchal; + $r['hide_empty'] = 1; + $r['show_count'] = 1; + $r['selected'] = ( isset( $wp_query->query['product_cat'] ) ) ? $wp_query->query['product_cat'] : ''; $terms = get_terms( 'product_cat', $r ); + if (!$terms) return; $output = "