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/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::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() ) ) { + ?>
    @@ -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 7f871e24073..cc36bb3e02c 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()) : ?> +$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() ) ) { + ?>
  • - \ No newline at end of file + \ No newline at end of file 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 ''; - - } else { - 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 ''; - } /** @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 = "