';
- 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/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;
}
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 7acc48111e8..c98c8773eac 100644
--- a/readme.txt
+++ b/readme.txt
@@ -145,10 +145,12 @@ 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
* Localization - Bundled translation updates
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() ) ) {
+ ?>