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 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 18 additions & 1 deletion src/BlockTypes/ProductQuery.php
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.
kmanijak marked this conversation as resolved.
Show resolved Hide resolved
* @return array
*/
private function merge_tax_queries( ...$queries ) {
kmanijak marked this conversation as resolved.
Show resolved Hide resolved
$tax_query = array();
foreach ( $queries as $query ) {
if ( ! empty( $query['tax_query'] ) ) {
$tax_query = array_merge( $tax_query, $query['tax_query'] );
}
}
return array( '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
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 array
kmanijak marked this conversation as resolved.
Show resolved Hide resolved
*/
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'],
);
}
}