Skip to content
This repository has been archived by the owner on Feb 23, 2024. It is now read-only.

[Products]: Fix attributes filters that do not update the editor preview correctly #8611

Merged
merged 5 commits into from
Mar 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion src/BlockTypes/ProductQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,22 @@ public function update_query( $pre_render, $parsed_block ) {
}
}

/**
* Merge tax_queries from various queries.
*
* @param array ...$queries Query arrays to be merged.
* @return array
*/
private function merge_tax_queries( ...$queries ) {
kmanijak marked this conversation as resolved.
Show resolved Hide resolved
$tax_query = [];
foreach ( $queries as $query ) {
if ( ! empty( $query['tax_query'] ) ) {
$tax_query = array_merge( $tax_query, $query['tax_query'] );
}
}
return [ 'tax_query' => $tax_query ];
}

/**
* Update the query for the product query block in Editor.
*
Expand All @@ -128,8 +144,9 @@ public function update_rest_query( $args, $request ) {
$attributes_query = is_array( $woo_attributes ) ? $this->get_product_attributes_query( $woo_attributes ) : array();
$stock_query = is_array( $woo_stock_status ) ? $this->get_stock_status_query( $woo_stock_status ) : array();
$visibility_query = $this->get_product_visibility_query( $stock_query );
$tax_query = $this->merge_tax_queries( $attributes_query, $visibility_query );

return array_merge( $args, $on_sale_query, $orderby_query, $attributes_query, $stock_query, $visibility_query );
return array_merge( $args, $on_sale_query, $orderby_query, $stock_query, $tax_query );
}

/**
Expand Down
96 changes: 94 additions & 2 deletions tests/php/BlockTypes/ProductQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
*/
class ProductQuery extends \WP_UnitTestCase {
/**
* This variable holds our cart object.
* This variable holds our Product Query object.
*
* @var ProductQueryMock
*/
Expand Down Expand Up @@ -73,6 +73,23 @@ private function initialize_merged_query( $parsed_block = array() ) {
return $this->block_instance->build_query( $query );
}

/**
* Build a simplified request for testing.
*
* @param bool $woocommerce_on_sale WooCommerce on sale.
* @param array $woocommerce_attributes WooCommerce attributes.
* @param array $woocommerce_stock_status WooCommerce stock status.
* @return WP_REST_Request
*/
private function build_request( $woocommerce_on_sale = 'false', $woocommerce_attributes = array(), $woocommerce_stock_status = array() ) {
kmanijak marked this conversation as resolved.
Show resolved Hide resolved
$request = new \WP_REST_Request( 'GET', '/wp/v2/product' );
$request->set_param( '__woocommerceOnSale', $woocommerce_on_sale );
$request->set_param( '__woocommerceAttributes', $woocommerce_attributes );
$request->set_param( '__woocommerceStockStatus', $woocommerce_stock_status );

return $request;
}

/**
* Test merging on sale queries.
*/
Expand Down Expand Up @@ -513,5 +530,80 @@ public function test_merging_multiple_filter_queries() {
set_query_var( 'min_price', '' );
set_query_var( 'filter_stock_status', '' );
}
}

/**
* Test merging multiple filter queries.
*/
public function test_updating_rest_query_without_attributes() {
$args = array();
$request = $this->build_request();

$updated_query = $this->block_instance->update_rest_query( $args, $request );

$this->assertContainsEquals(
array(
'key' => '_stock_status',
'value' => array(),
'compare' => 'IN',
),
$updated_query['meta_query'],
);

$this->assertEquals(
array(
array(
kmanijak marked this conversation as resolved.
Show resolved Hide resolved
'taxonomy' => 'product_visibility',
'field' => 'term_taxonomy_id',
'terms' => array( 0 ),
'operator' => 'NOT IN',
),
),
$updated_query['tax_query'],
);
}

/**
* Test merging multiple filter queries.
*/
public function test_updating_rest_query_with_attributes() {
$args = array();
$on_sale = 'true';
$attributes = array(
array(
'taxonomy' => 'pa_test',
'termId' => 1,
),
);
$stock_status = array( 'instock', 'outofstock' );
$request = $this->build_request( $on_sale, $attributes, $stock_status );

$updated_query = $this->block_instance->update_rest_query( $args, $request );

$this->assertContainsEquals(
array(
'key' => '_stock_status',
'value' => array( 'instock', 'outofstock' ),
'compare' => 'IN',
),
$updated_query['meta_query'],
);

$this->assertEquals(
array(
array(
'taxonomy' => 'pa_test',
'field' => 'term_id',
'terms' => array( 1 ),
'operator' => 'IN',
),
array(
'taxonomy' => 'product_visibility',
'field' => 'term_taxonomy_id',
'terms' => array( 0 ),
'operator' => 'NOT IN',
),
),
$updated_query['tax_query'],
);
}
}