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.
 	 *