Render product_attribute shortcode results with WC_Shortcode_Products

This commit is contained in:
Claudio Sanches 2017-08-25 19:07:10 -03:00
parent ddeea547b1
commit 32ea76f09f
3 changed files with 78 additions and 47 deletions

View File

@ -622,33 +622,22 @@ class WC_Shortcodes {
* @return string * @return string
*/ */
public static function product_attribute( $atts ) { public static function product_attribute( $atts ) {
$atts = shortcode_atts( array( $atts = array_merge( array(
'per_page' => '12', 'per_page' => '12',
'columns' => '4', 'columns' => '4',
'orderby' => 'title', 'orderby' => 'title',
'order' => 'asc', 'order' => 'asc',
'attribute' => '', 'attribute' => '',
'filter' => '', 'filter' => '',
), $atts, 'product_attribute' ); ), (array) $atts );
$query_args = array( if ( empty( $atts['attribute'] ) || empty( $atts['filter'] ) ) {
'post_type' => 'product', return '';
'post_status' => 'publish', }
'ignore_sticky_posts' => 1,
'posts_per_page' => $atts['per_page'],
'orderby' => $atts['orderby'],
'order' => $atts['order'],
'meta_query' => WC()->query->get_meta_query(),
'tax_query' => WC()->query->get_tax_query(),
);
$query_args['tax_query'][] = array( $shortcode = new WC_Shortcode_Products( $atts, 'product_attribute' );
'taxonomy' => strstr( $atts['attribute'], 'pa_' ) ? sanitize_title( $atts['attribute'] ) : 'pa_' . sanitize_title( $atts['attribute'] ),
'terms' => array_map( 'sanitize_title', explode( ',', $atts['filter'] ) ),
'field' => 'slug',
);
return self::product_loop( $query_args, $atts, 'product_attribute' ); return $shortcode->get_content();
} }
/** /**

View File

@ -111,6 +111,8 @@ class WC_Shortcode_Products {
'category' => '', // Slugs. 'category' => '', // Slugs.
'operator' => 'IN', // Category operator. Possible values are 'IN', 'NOT IN', 'AND'. 'operator' => 'IN', // Category operator. Possible values are 'IN', 'NOT IN', 'AND'.
'class' => '', 'class' => '',
'attribute' => '',
'filter' => '',
), $attributes, $this->type ); ), $attributes, $this->type );
} }
@ -173,12 +175,21 @@ class WC_Shortcode_Products {
if ( 'featured_products' === $this->type ) { if ( 'featured_products' === $this->type ) {
$query_args['tax_query'][] = array( $query_args['tax_query'][] = array(
'taxonomy' => 'product_visibility', 'taxonomy' => 'product_visibility',
'field' => 'name',
'terms' => 'featured', 'terms' => 'featured',
'field' => 'name',
'operator' => 'IN', 'operator' => 'IN',
); );
} }
// Attributes.
if ( ! empty( $this->attributes['attribute'] ) || ! empty( $this->attributes['filter'] ) ) {
$query_args['tax_query'][] = array(
'taxonomy' => strstr( $this->attributes['attribute'], 'pa_' ) ? sanitize_title( $this->attributes['attribute'] ) : 'pa_' . sanitize_title( $this->attributes['attribute'] ),
'terms' => array_map( 'sanitize_title', explode( ',', $this->attributes['filter'] ) ),
'field' => 'slug',
);
}
// Categories. // Categories.
if ( ! empty( $this->attributes['category'] ) ) { if ( ! empty( $this->attributes['category'] ) ) {
$ordering_args = WC()->query->get_catalog_ordering_args( $query_args['orderby'], $query_args['order'] ); $ordering_args = WC()->query->get_catalog_ordering_args( $query_args['orderby'], $query_args['order'] );

View File

@ -22,6 +22,8 @@ class WC_Test_Shortcode_Products extends WC_Unit_Test_Case {
'category' => '', 'category' => '',
'operator' => 'IN', 'operator' => 'IN',
'class' => '', 'class' => '',
'attribute' => '',
'filter' => '',
); );
$this->assertEquals( $expected, $shortcode->get_attributes() ); $this->assertEquals( $expected, $shortcode->get_attributes() );
@ -39,6 +41,8 @@ class WC_Test_Shortcode_Products extends WC_Unit_Test_Case {
'category' => '', 'category' => '',
'operator' => 'IN', 'operator' => 'IN',
'class' => '', 'class' => '',
'attribute' => '',
'filter' => '',
); );
$this->assertEquals( $expected2, $shortcode2->get_attributes() ); $this->assertEquals( $expected2, $shortcode2->get_attributes() );
} }
@ -274,7 +278,34 @@ class WC_Test_Shortcode_Products extends WC_Unit_Test_Case {
) ), ) ),
); );
$this->assertEquals( $expected9, $shortcode9->get_query_args() ); // product_attribute shortcode.
$shortcode10 = new WC_Shortcode_Products( array(
'per_page' => '12',
'columns' => '4',
'orderby' => 'title',
'order' => 'asc',
'attribute' => 'color',
'filter' => 'black',
), 'product_attribute' );
$expected10 = array(
'post_type' => 'product',
'post_status' => 'publish',
'ignore_sticky_posts' => true,
'no_found_rows' => true,
'orderby' => 'title',
'order' => 'ASC',
'posts_per_page' => 12,
'meta_query' => $meta_query,
'tax_query' => array_merge( $tax_query, array(
array(
'taxonomy' => 'pa_color',
'terms' => array( 'black' ),
'field' => 'slug',
),
) ),
);
$this->assertEquals( $expected10, $shortcode10->get_query_args() );
} }
/** /**