Commit 3ef84e46e8b for woocommerce

commit 3ef84e46e8b56c26407e1830ee2f3a13dd5cfef6
Author: Vladimir Reznichenko <kalessil@gmail.com>
Date:   Tue Oct 27 12:23:08 2026 +0100

    [Performance] Fix N+1 query pattern when blocks rendering featured images. (#70237)

    Fixes \Automattic\WooCommerce\Blocks\BlockTypes\ProductTemplate::block_core_post_template_uses_featured_image implementation (not a correctly replicated version of block_core_post_template_uses_featured_image from upstream). The existing thumbnail batch-priming never fired because the detection didn't recognize woocommerce/product-image, so every product in a related products grid loaded its thumbnail individually.

diff --git a/plugins/woocommerce/changelog/performance-product-page-featured-images-handling b/plugins/woocommerce/changelog/performance-product-page-featured-images-handling
new file mode 100644
index 00000000000..795fabfd184
--- /dev/null
+++ b/plugins/woocommerce/changelog/performance-product-page-featured-images-handling
@@ -0,0 +1,4 @@
+Significance: minor
+Type: performance
+
+Fixed N+1 query pattern when blocks rendering featured images on product page.
diff --git a/plugins/woocommerce/phpstan-baseline.neon b/plugins/woocommerce/phpstan-baseline.neon
index 5cf3e639980..c5d6ccbf294 100644
--- a/plugins/woocommerce/phpstan-baseline.neon
+++ b/plugins/woocommerce/phpstan-baseline.neon
@@ -50253,30 +50253,12 @@ parameters:
 			count: 2
 			path: src/Blocks/BlockTypes/ProductTag.php

-		-
-			message: '#^Iterating over an object of an unknown class Automattic\\WooCommerce\\Blocks\\BlockTypes\\WP_Block_List\.$#'
-			identifier: class.notFound
-			count: 1
-			path: src/Blocks/BlockTypes/ProductTemplate.php
-
 		-
 			message: '#^Method Automattic\\WooCommerce\\Blocks\\BlockTypes\\ProductTemplate\:\:initialize\(\) has no return type specified\.$#'
 			identifier: missingType.return
 			count: 1
 			path: src/Blocks/BlockTypes/ProductTemplate.php

-		-
-			message: '#^Parameter \#1 \$inner_blocks of method Automattic\\WooCommerce\\Blocks\\BlockTypes\\ProductTemplate\:\:block_core_post_template_uses_featured_image\(\) expects Automattic\\WooCommerce\\Blocks\\BlockTypes\\WP_Block_List, WP_Block_List given\.$#'
-			identifier: argument.type
-			count: 1
-			path: src/Blocks/BlockTypes/ProductTemplate.php
-
-		-
-			message: '#^Parameter \$inner_blocks of method Automattic\\WooCommerce\\Blocks\\BlockTypes\\ProductTemplate\:\:block_core_post_template_uses_featured_image\(\) has invalid type Automattic\\WooCommerce\\Blocks\\BlockTypes\\WP_Block_List\.$#'
-			identifier: class.notFound
-			count: 1
-			path: src/Blocks/BlockTypes/ProductTemplate.php
-
 		-
 			message: '#^Method Automattic\\WooCommerce\\Blocks\\BlockTypes\\ProductTitle\:\:register_block_type_assets\(\) has no return type specified\.$#'
 			identifier: missingType.return
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/ProductTemplate.php b/plugins/woocommerce/src/Blocks/BlockTypes/ProductTemplate.php
index 6df400ac8b1..5ea89fb8483 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/ProductTemplate.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/ProductTemplate.php
@@ -168,22 +168,19 @@ class ProductTemplate extends AbstractBlock {
 	/**
 	 * Determines whether a block list contains a block that uses the featured image.
 	 *
-	 * @param WP_Block_List $inner_blocks Inner block instance.
-	 *
+	 * @param \WP_Block_List $inner_blocks Inner block instance.
 	 * @return bool Whether the block list contains a block that uses the featured image.
 	 */
 	protected function block_core_post_template_uses_featured_image( $inner_blocks ) {
+		// Extended replica from upstreams' block_core_post_template_uses_featured_image function.
 		foreach ( $inner_blocks as $block ) {
-			if ( 'core/post-featured-image' === $block->name ) {
+			if ( 'core/post-featured-image' === $block->name || 'woocommerce/product-image' === $block->name ) {
 				return true;
 			}
-			if (
-			'core/cover' === $block->name &&
-			! empty( $block->attributes['useFeaturedImage'] )
-			) {
+			if ( 'core/cover' === $block->name && ! empty( $block->attributes['useFeaturedImage'] ) ) {
 				return true;
 			}
-			if ( $block->inner_blocks && block_core_post_template_uses_featured_image( $block->inner_blocks ) ) {
+			if ( $block->inner_blocks && $this->block_core_post_template_uses_featured_image( $block->inner_blocks ) ) {
 				return true;
 			}
 		}