API: Remove custom `attributes` handling from API (https://github.com/woocommerce/woocommerce-blocks/pull/401)
This commit is contained in:
parent
60b4cd5fcc
commit
8da93d36f1
|
@ -233,9 +233,7 @@ class WGPB_Products_Controller extends WC_REST_Products_Controller {
|
||||||
$orderby = $request->get_param( 'orderby' );
|
$orderby = $request->get_param( 'orderby' );
|
||||||
$order = $request->get_param( 'order' );
|
$order = $request->get_param( 'order' );
|
||||||
$cat_operator = $request->get_param( 'cat_operator' );
|
$cat_operator = $request->get_param( 'cat_operator' );
|
||||||
$attributes = $request->get_param( 'attributes' );
|
|
||||||
$attr_operator = $request->get_param( 'attr_operator' );
|
$attr_operator = $request->get_param( 'attr_operator' );
|
||||||
$tax_relation = $request->get_param( 'tax_relation' );
|
|
||||||
|
|
||||||
$ordering_args = WC()->query->get_catalog_ordering_args( $orderby, $order );
|
$ordering_args = WC()->query->get_catalog_ordering_args( $orderby, $order );
|
||||||
$args['orderby'] = $ordering_args['orderby'];
|
$args['orderby'] = $ordering_args['orderby'];
|
||||||
|
@ -253,32 +251,14 @@ class WGPB_Products_Controller extends WC_REST_Products_Controller {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$tax_query = array();
|
if ( $attr_operator && isset( $args['tax_query'] ) ) {
|
||||||
if ( $attributes ) {
|
foreach ( $args['tax_query'] as $i => $tax_query ) {
|
||||||
foreach ( $attributes as $attribute => $attribute_terms ) {
|
if ( in_array( $tax_query['taxonomy'], wc_get_attribute_taxonomy_names(), true ) ) {
|
||||||
if ( in_array( $attribute, wc_get_attribute_taxonomy_names(), true ) ) {
|
$args['tax_query'][ $i ]['operator'] = $attr_operator;
|
||||||
$tax_query[] = array(
|
|
||||||
'taxonomy' => $attribute,
|
|
||||||
'field' => 'term_id',
|
|
||||||
'terms' => $attribute_terms,
|
|
||||||
'operator' => ! $attr_operator ? 'IN' : $attr_operator,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge attribute `$tax_query`s into the request's WP_Query args.
|
|
||||||
if ( ! empty( $tax_query ) ) {
|
|
||||||
if ( ! empty( $args['tax_query'] ) ) {
|
|
||||||
$args['tax_query'] = array_merge( $tax_query, $args['tax_query'] ); // WPCS: slow query ok.
|
|
||||||
} else {
|
|
||||||
$args['tax_query'] = $tax_query; // WPCS: slow query ok.
|
|
||||||
}
|
|
||||||
if ( ! empty( $tax_relation ) && count( $tax_query ) > 1 ) {
|
|
||||||
$args['tax_query']['relation'] = 'AND' === $tax_relation ? 'AND' : 'OR';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $args;
|
return $args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,8 +289,7 @@ class WGPB_Products_Controller extends WC_REST_Products_Controller {
|
||||||
/**
|
/**
|
||||||
* Update the collection params.
|
* Update the collection params.
|
||||||
*
|
*
|
||||||
* Adds new options for 'orderby', and new parameters 'cat_operator', 'attributes',
|
* Adds new options for 'orderby', and new parameters 'cat_operator', 'attr_operator'.
|
||||||
* 'attr_operator', and 'tax_relation'.
|
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
|
@ -327,34 +306,10 @@ class WGPB_Products_Controller extends WC_REST_Products_Controller {
|
||||||
$params['attr_operator'] = array(
|
$params['attr_operator'] = array(
|
||||||
'description' => __( 'Operator to compare product attribute terms.', 'woo-gutenberg-products-block' ),
|
'description' => __( 'Operator to compare product attribute terms.', 'woo-gutenberg-products-block' ),
|
||||||
'type' => 'string',
|
'type' => 'string',
|
||||||
'enum' => array( 'IN', 'AND' ),
|
'enum' => array( 'IN', 'NOT IN', 'AND' ),
|
||||||
'sanitize_callback' => 'sanitize_text_field',
|
'sanitize_callback' => 'sanitize_text_field',
|
||||||
'validate_callback' => 'rest_validate_request_arg',
|
'validate_callback' => 'rest_validate_request_arg',
|
||||||
);
|
);
|
||||||
$params['tax_relation'] = array(
|
|
||||||
'description' => __( 'The logical relationship between each inner taxonomy array when there is more than one.', 'woo-gutenberg-products-block' ),
|
|
||||||
'type' => 'string',
|
|
||||||
'enum' => array( 'AND', 'OR' ),
|
|
||||||
'sanitize_callback' => 'sanitize_text_field',
|
|
||||||
'validate_callback' => 'rest_validate_request_arg',
|
|
||||||
);
|
|
||||||
|
|
||||||
$attr_properties = array();
|
|
||||||
foreach ( wc_get_attribute_taxonomy_names() as $name ) {
|
|
||||||
$attr_properties[ $name ] = array(
|
|
||||||
'type' => 'array',
|
|
||||||
'items' => array( 'type' => 'string' ),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$params['attributes'] = array(
|
|
||||||
'description' => __( 'Map of attributes to selected terms.', 'woo-gutenberg-products-block' ),
|
|
||||||
'type' => 'object',
|
|
||||||
'validate_callback' => 'rest_validate_request_arg',
|
|
||||||
);
|
|
||||||
if ( ! empty( $attr_properties ) ) {
|
|
||||||
$params['attributes']['properties'] = $attr_properties;
|
|
||||||
$params['attributes']['additionalProperties'] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $params;
|
return $params;
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,14 +130,11 @@ class WC_Tests_API_Products_By_Attributes_Controller extends WC_REST_Unit_Test_C
|
||||||
public function test_get_products_by_multiple_terms_all() {
|
public function test_get_products_by_multiple_terms_all() {
|
||||||
wp_set_current_user( $this->user );
|
wp_set_current_user( $this->user );
|
||||||
$request = new WP_REST_Request( 'GET', $this->endpoint . '/products' );
|
$request = new WP_REST_Request( 'GET', $this->endpoint . '/products' );
|
||||||
|
$request->set_param( 'attribute', 'pa_size' );
|
||||||
$request->set_param(
|
$request->set_param(
|
||||||
'attributes',
|
'attribute_term',
|
||||||
array(
|
// Terms list needs to be a string.
|
||||||
'pa_color' => array(
|
$this->attr_term_ids['medium'] . ',' . $this->attr_term_ids['large']
|
||||||
$this->attr_term_ids['red'],
|
|
||||||
$this->attr_term_ids['blue'],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
$request->set_param( 'attr_operator', 'AND' );
|
$request->set_param( 'attr_operator', 'AND' );
|
||||||
|
|
||||||
|
@ -146,68 +143,4 @@ class WC_Tests_API_Products_By_Attributes_Controller extends WC_REST_Unit_Test_C
|
||||||
$this->assertEquals( 200, $response->get_status() );
|
$this->assertEquals( 200, $response->get_status() );
|
||||||
$this->assertEquals( 1, count( $response_products ) );
|
$this->assertEquals( 1, count( $response_products ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Test getting products by multiple terms in multiple attributes, matching any.
|
|
||||||
*
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
public function test_get_products_by_multiple_terms_multiple_attrs_any() {
|
|
||||||
wp_set_current_user( $this->user );
|
|
||||||
$request = new WP_REST_Request( 'GET', $this->endpoint . '/products' );
|
|
||||||
$request->set_param(
|
|
||||||
'attributes',
|
|
||||||
array(
|
|
||||||
'pa_color' => array( $this->attr_term_ids['red'] ),
|
|
||||||
'pa_size' => array( $this->attr_term_ids['large'] ),
|
|
||||||
)
|
|
||||||
);
|
|
||||||
$request->set_param( 'attr_operator', 'IN' );
|
|
||||||
$request->set_param( 'tax_relation', 'OR' );
|
|
||||||
|
|
||||||
$response = $this->server->dispatch( $request );
|
|
||||||
$response_products = $response->get_data();
|
|
||||||
$this->assertEquals( 200, $response->get_status() );
|
|
||||||
$this->assertEquals( 2, count( $response_products ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test getting products by multiple terms in multiple attributes, matching all.
|
|
||||||
*
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
public function test_get_products_by_multiple_terms_multiple_attrs_all() {
|
|
||||||
wp_set_current_user( $this->user );
|
|
||||||
$request = new WP_REST_Request( 'GET', $this->endpoint . '/products' );
|
|
||||||
$request->set_param(
|
|
||||||
'attributes',
|
|
||||||
array(
|
|
||||||
'pa_color' => array( $this->attr_term_ids['blue'] ),
|
|
||||||
'pa_size' => array( $this->attr_term_ids['medium'] ),
|
|
||||||
)
|
|
||||||
);
|
|
||||||
$request->set_param( 'attr_operator', 'AND' );
|
|
||||||
$request->set_param( 'tax_relation', 'AND' );
|
|
||||||
|
|
||||||
$response = $this->server->dispatch( $request );
|
|
||||||
$response_products = $response->get_data();
|
|
||||||
$this->assertEquals( 200, $response->get_status() );
|
|
||||||
$this->assertEquals( 2, count( $response_products ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test getting products by attributes that don't exist.
|
|
||||||
*
|
|
||||||
* Note: This test is currently skipped because the API isn't registering the attribute
|
|
||||||
* properties correctly, and therefor not validating attribute names against "real" attributes.
|
|
||||||
*
|
|
||||||
* @since 1.2.0
|
|
||||||
*/
|
|
||||||
public function xtest_get_products_by_fake_attrs() {
|
|
||||||
wp_set_current_user( $this->user );
|
|
||||||
$request = new WP_REST_Request( 'GET', $this->endpoint . '/products' );
|
|
||||||
$request->set_param( 'attributes', array( 'pa_fake' => array( 21 ) ) );
|
|
||||||
$response = $this->server->dispatch( $request );
|
|
||||||
$this->assertEquals( 400, $response->get_status() );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue