Commit 8824a496dd3 for woocommerce
commit 8824a496dd307f3997fb485886d21aba301b0fc0
Author: Tung Du <dinhtungdu@gmail.com>
Date: Wed Aug 26 11:40:18 2026 +0700
Fix Product Filters when Shop is the static front page (#67791)
* fix: preserve Product Filters on static front page
* chore: add Product Filters front-page changelog
* Update plugins/woocommerce/includes/class-wc-query.php
Co-authored-by: Karol Manijak <20098064+kmanijak@users.noreply.github.com>
---------
Co-authored-by: Karol Manijak <20098064+kmanijak@users.noreply.github.com>
diff --git a/plugins/woocommerce/changelog/wc-67498-front-page-filters-design b/plugins/woocommerce/changelog/wc-67498-front-page-filters-design
new file mode 100644
index 00000000000..d7aa6e38e6a
--- /dev/null
+++ b/plugins/woocommerce/changelog/wc-67498-front-page-filters-design
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Fix Product Filters on a Shop page set as the static front page.
diff --git a/plugins/woocommerce/includes/class-wc-query.php b/plugins/woocommerce/includes/class-wc-query.php
index 07b00b142f0..d216b890313 100644
--- a/plugins/woocommerce/includes/class-wc-query.php
+++ b/plugins/woocommerce/includes/class-wc-query.php
@@ -7,6 +7,7 @@
*/
use Automattic\WooCommerce\Internal\ProductAttributesLookup\Filterer;
+use Automattic\WooCommerce\Internal\ProductFilters\Params;
use Automattic\WooCommerce\Enums\ProductStockStatus;
use Automattic\WooCommerce\Enums\TaxDisplayMode;
@@ -314,7 +315,7 @@ class WC_Query {
*/
private function is_query_var_valid_on_front_page( $query_var ) {
return in_array( $query_var, array( 'preview', 'page', 'paged', 'cpage', 'orderby' ), true )
- || in_array( $query_var, array( 'min_price', 'max_price', 'rating_filter' ), true )
+ || in_array( $query_var, wc_get_container()->get( Params::class )->get_param_keys(), true )
|| 0 === strpos( $query_var, 'filter_' )
|| 0 === strpos( $query_var, 'query_type_' );
}
diff --git a/plugins/woocommerce/src/Internal/ProductFilters/QueryClauses.php b/plugins/woocommerce/src/Internal/ProductFilters/QueryClauses.php
index b2c5a93e090..f60c317413b 100644
--- a/plugins/woocommerce/src/Internal/ProductFilters/QueryClauses.php
+++ b/plugins/woocommerce/src/Internal/ProductFilters/QueryClauses.php
@@ -579,7 +579,7 @@ class QueryClauses implements QueryClausesGenerator, MainQueryClausesGenerator {
}
foreach ( $this->params->get_param( 'taxonomy' ) as $taxonomy => $param ) {
- if ( isset( $query_vars[ $param ] ) && ! empty( trim( $query_vars[ $param ] ) ) ) {
+ if ( isset( $query_vars[ $param ] ) && is_string( $query_vars[ $param ] ) && ! empty( trim( $query_vars[ $param ] ) ) ) {
$chosen_taxonomies[ $taxonomy ] = array_filter( array_map( 'sanitize_title', explode( ',', $query_vars[ $param ] ) ) );
}
}
diff --git a/plugins/woocommerce/tests/php/includes/class-wc-query-test.php b/plugins/woocommerce/tests/php/includes/class-wc-query-test.php
index 26ab69bca95..bf61bab8d35 100644
--- a/plugins/woocommerce/tests/php/includes/class-wc-query-test.php
+++ b/plugins/woocommerce/tests/php/includes/class-wc-query-test.php
@@ -73,6 +73,15 @@ class WC_Query_Test extends \WC_Unit_Test_Case {
$this->assertTrue( defined( 'SHOP_IS_ON_FRONT' ) && SHOP_IS_ON_FRONT );
$this->assert_shop_page_queried_object( $query, $shop_page_id );
+ foreach ( array( 'categories', 'tags', 'brands' ) as $query_var ) {
+ $query = new WP_Query();
+ $wp_the_query = $query; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
+ $query->query( array( $query_var => 'filter-term' ) );
+
+ $this->assertSame( 'product_query', $query->get( 'wc_query' ), "{$query_var} should preserve the product query." );
+ $this->assert_shop_page_queried_object( $query, $shop_page_id );
+ }
+
// Reset main query, options and delete the page we created.
$wp_the_query = $previous_wp_the_query; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
update_option( 'woocommerce_shop_page_id', $default_woocommerce_shop_page_id );
diff --git a/plugins/woocommerce/tests/php/src/Internal/ProductFilters/QueryClausesTest.php b/plugins/woocommerce/tests/php/src/Internal/ProductFilters/QueryClausesTest.php
index ffd865323c5..71a544d47e1 100644
--- a/plugins/woocommerce/tests/php/src/Internal/ProductFilters/QueryClausesTest.php
+++ b/plugins/woocommerce/tests/php/src/Internal/ProductFilters/QueryClausesTest.php
@@ -240,6 +240,17 @@ class QueryClausesTest extends AbstractProductFiltersTest {
$this->assertEqualsCanonicalizing( $expected_products_name, $received_products_name );
}
+ /**
+ * @testdox Non-string taxonomy filter values are ignored.
+ */
+ public function test_non_string_taxonomy_filter_values_are_ignored(): void {
+ $query = new \WP_Query();
+ $query->query_vars['categories'] = array( 'cat-1' );
+ $clauses = array( 'where' => '' );
+
+ $this->assertSame( $clauses, $this->sut->add_query_clauses( $clauses, $query ) );
+ }
+
/**
* @testdox A hierarchical category filter must match products in descendant categories without a child_of query per chosen term.
*