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;
}
}