Commit 88136bab219 for woocommerce

commit 88136bab219f689133b6f27326aaa14240d22c70
Author: Vladimir Reznichenko <kalessil@gmail.com>
Date:   Wed Jul 22 15:07:02 2026 +0200

    [Performance] Address edge-case concerns reported by an AI after merging #66084. (#66853)

diff --git a/plugins/woocommerce/includes/data-stores/class-wc-product-variable-data-store-cpt.php b/plugins/woocommerce/includes/data-stores/class-wc-product-variable-data-store-cpt.php
index ab354b20f03..9dc0d635e9f 100644
--- a/plugins/woocommerce/includes/data-stores/class-wc-product-variable-data-store-cpt.php
+++ b/plugins/woocommerce/includes/data-stores/class-wc-product-variable-data-store-cpt.php
@@ -266,7 +266,9 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple
 					)
 				);
 				foreach ( $prefetch as $row ) {
-					$attributes_values[ $row->meta_key ][] = $row->meta_value;
+					// Defensive: normalize non-canonical meta_key casing (e.g. attribute_pa_Size → attribute_pa_size).
+					// sanitize_title over wc_variation_attribute_name as the latter adds 'attribute_' prefix.
+					$attributes_values[ sanitize_title( $row->meta_key ) ][] = $row->meta_value;
 				}
 			}

diff --git a/plugins/woocommerce/tests/php/includes/data-stores/class-wc-product-variable-data-store-cpt-test.php b/plugins/woocommerce/tests/php/includes/data-stores/class-wc-product-variable-data-store-cpt-test.php
index 3c461cc897c..48107c4f789 100644
--- a/plugins/woocommerce/tests/php/includes/data-stores/class-wc-product-variable-data-store-cpt-test.php
+++ b/plugins/woocommerce/tests/php/includes/data-stores/class-wc-product-variable-data-store-cpt-test.php
@@ -1883,4 +1883,35 @@ class WC_Product_Variable_Data_Store_CPT_Test extends WC_Unit_Test_Case {

 		$product->delete();
 	}
+
+	/**
+	 * @testdox read_variation_attributes returns all assigned values even when a variation meta key is stored with non-canonical casing (e.g. attribute_pa_Size instead of attribute_pa_size).
+	 */
+	public function test_read_variation_attributes_non_canonical_meta_key_casing(): void {
+		global $wpdb;
+
+		$product    = WC_Helper_Product::create_variation_product();
+		$product_id = $product->get_id();
+
+		// Simulate legacy/third-party data: one variation's attribute meta key stored with non-canonical casing.
+		$variation_id = current( array_filter( $product->get_children(), static fn( $id ) => 'small' === get_post_meta( $id, 'attribute_pa_size', true ) ) );
+		$wpdb->update(
+			$wpdb->postmeta,
+			array(
+				'meta_key' => 'attribute_pa_Size', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
+			),
+			array(
+				'post_id'  => $variation_id,
+				'meta_key' => 'attribute_pa_size', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
+			)
+		);
+		WC_Cache_Helper::invalidate_cache_group( 'product_' . $product_id );
+		$product = wc_get_product( $product_id );
+
+		$sizes = ( new WC_Product_Variable_Data_Store_CPT() )->read_variation_attributes( $product )['pa_size'];
+
+		$this->assertSame( array( 'small', 'large', 'huge' ), $sizes );
+
+		$product->delete( true );
+	}
 }