Commit 456575b37ea for woocommerce
commit 456575b37ea37b917faeb14260200e60bdcf7491
Author: Darren Ethier <darren@roughsmootheng.in>
Date: Fri Sep 4 15:05:54 2026 -0400
Annotate REST product query suppressions with exact sniff codes (#68299)
diff --git a/plugins/woocommerce/changelog/fix-wooplug-7556-rest-product-query-suppressions b/plugins/woocommerce/changelog/fix-wooplug-7556-rest-product-query-suppressions
new file mode 100644
index 00000000000..30b53256c2d
--- /dev/null
+++ b/plugins/woocommerce/changelog/fix-wooplug-7556-rest-product-query-suppressions
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Replace legacy WPCS suppression comments on REST product and variation meta queries with explicit phpcs:ignore annotations that record why postmeta remains the correct path.
diff --git a/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-products-v2-controller.php b/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-products-v2-controller.php
index 2d527762008..1022857eaa2 100644
--- a/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-products-v2-controller.php
+++ b/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-products-v2-controller.php
@@ -419,7 +419,7 @@ class WC_REST_Products_V2_Controller extends WC_REST_CRUD_Controller {
$skus[] = $request['sku'];
}
- $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Exact _sku match; wc_product_meta_lookup truncates SKUs to 100 chars and is empty while it regenerates, so it is not an equivalent path.
$args,
array(
'key' => '_sku',
@@ -431,7 +431,7 @@ class WC_REST_Products_V2_Controller extends WC_REST_CRUD_Controller {
// Filter by tax class.
if ( ! empty( $request['tax_class'] ) ) {
- $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- wc_product_meta_lookup.tax_class is unindexed and holds NULL where _tax_class is unset, so it is neither faster nor equivalent.
$args,
array(
'key' => '_tax_class',
@@ -442,12 +442,12 @@ class WC_REST_Products_V2_Controller extends WC_REST_CRUD_Controller {
// Price filter.
if ( ! empty( $request['min_price'] ) || ! empty( $request['max_price'] ) ) {
- $args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- _price is stored once per child price; wc_product_meta_lookup keeps only min/max and would match a wider range.
}
// Filter product in stock or out of stock.
if ( is_bool( $request['in_stock'] ) ) {
- $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Postmeta stays correct while wc_product_meta_lookup is stale or regenerating; the _stock_status meta_key index bounds the scan.
$args,
array(
'key' => '_stock_status',
diff --git a/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-product-variations-controller.php b/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-product-variations-controller.php
index d53dad3015e..43eb9f67859 100644
--- a/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-product-variations-controller.php
+++ b/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-product-variations-controller.php
@@ -1033,7 +1033,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V
$skus[] = $request['sku'];
}
- $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Bounded to one parent's variations by post_parent; wc_product_meta_lookup truncates SKUs to 100 chars.
$args,
array(
'key' => '_sku',
@@ -1058,7 +1058,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V
// Filter by tax class.
if ( ! empty( $request['tax_class'] ) ) {
- $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Bounded to one parent's variations by post_parent, so this resolves through the postmeta post_id index.
$args,
array(
'key' => '_tax_class',
@@ -1069,13 +1069,13 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V
// Price filter.
if ( ! empty( $request['min_price'] ) || ! empty( $request['max_price'] ) ) {
- $args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Bounded to one parent's variations by post_parent; wc_product_meta_lookup keeps only min/max and would match a wider range.
}
// Price filter.
if ( is_bool( $request['has_price'] ) ) {
if ( $request['has_price'] ) {
- $args['meta_query'] = $this->add_meta_query( // phpcs:ignore Standard.Category.SniffName.ErrorCode slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Bounded to one parent's variations by post_parent; wc_product_meta_lookup keeps only min/max and would match a wider range.
$args,
array(
'relation' => 'AND',
@@ -1091,7 +1091,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V
)
);
} else {
- $args['meta_query'] = $this->add_meta_query( // phpcs:ignore Standard.Category.SniffName.ErrorCode slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Bounded to one parent's variations by post_parent; wc_product_meta_lookup keeps only min/max and would match a wider range.
$args,
array(
'relation' => 'OR',
@@ -1111,7 +1111,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V
// Filter product based on stock_status.
if ( ! empty( $request['stock_status'] ) ) {
- $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Bounded to one parent's variations by post_parent, so this resolves through the postmeta post_id index.
$args,
array(
'key' => '_stock_status',
diff --git a/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-products-controller.php b/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-products-controller.php
index b4a7069e662..8fb5da1a7b0 100644
--- a/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-products-controller.php
+++ b/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-products-controller.php
@@ -400,7 +400,7 @@ class WC_REST_Products_Controller extends WC_REST_Products_V2_Controller {
$skus[] = $request['sku'];
}
- $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Exact _sku match; wc_product_meta_lookup truncates SKUs to 100 chars and is empty while it regenerates, so it is not an equivalent path.
$args,
array(
'key' => '_sku',
@@ -425,7 +425,7 @@ class WC_REST_Products_Controller extends WC_REST_Products_V2_Controller {
// Filter by tax class.
if ( ! empty( $request['tax_class'] ) ) {
- $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- wc_product_meta_lookup.tax_class is unindexed and holds NULL where _tax_class is unset, so it is neither faster nor equivalent.
$args,
array(
'key' => '_tax_class',
@@ -436,12 +436,12 @@ class WC_REST_Products_Controller extends WC_REST_Products_V2_Controller {
// Price filter.
if ( ! empty( $request['min_price'] ) || ! empty( $request['max_price'] ) ) {
- $args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- _price is stored once per child price; wc_product_meta_lookup keeps only min/max and would match a wider range.
}
// Filter product by stock_status.
if ( ! empty( $request['stock_status'] ) ) {
- $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args['meta_query'] = $this->add_meta_query( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- Postmeta stays correct while wc_product_meta_lookup is stale or regenerating; the _stock_status meta_key index bounds the scan.
$args,
array(
'key' => '_stock_status',