Commit 5daa2240f70 for woocommerce
commit 5daa2240f7056ff727dae2d8ff31c31c01ae41b2
Author: Luis Felipe Zaguini <26530524+zaguiini@users.noreply.github.com>
Date: Wed Nov 4 08:35:51 2026 -0300
Prime the post caches before the product abilities load variations (#70601)
Delete, create and update loaded each variation with its own post and
meta queries. One batch read now loads them all first.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
diff --git a/plugins/woocommerce/changelog/fix-wooairr-693-prime-variation-caches b/plugins/woocommerce/changelog/fix-wooairr-693-prime-variation-caches
new file mode 100644
index 00000000000..18000176419
--- /dev/null
+++ b/plugins/woocommerce/changelog/fix-wooairr-693-prime-variation-caches
@@ -0,0 +1,4 @@
+Significance: patch
+Type: performance
+
+Load all variations of a product in one batch when the product abilities delete, create, or update variations.
diff --git a/plugins/woocommerce/src/Internal/Abilities/Domain/ProductDelete.php b/plugins/woocommerce/src/Internal/Abilities/Domain/ProductDelete.php
index 6dfdc75c358..b0046242d92 100644
--- a/plugins/woocommerce/src/Internal/Abilities/Domain/ProductDelete.php
+++ b/plugins/woocommerce/src/Internal/Abilities/Domain/ProductDelete.php
@@ -241,6 +241,8 @@ class ProductDelete extends ActionableAbility {
)
);
+ _prime_post_caches( $variation_ids );
+
/** @var \WC_Product_Variation[] $variations */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$variations = array_map( 'wc_get_product', $variation_ids );
diff --git a/plugins/woocommerce/src/Internal/Abilities/Domain/Traits/ProductAbilityTrait.php b/plugins/woocommerce/src/Internal/Abilities/Domain/Traits/ProductAbilityTrait.php
index dd0c21b6603..c9a721e63aa 100644
--- a/plugins/woocommerce/src/Internal/Abilities/Domain/Traits/ProductAbilityTrait.php
+++ b/plugins/woocommerce/src/Internal/Abilities/Domain/Traits/ProductAbilityTrait.php
@@ -830,6 +830,8 @@ trait ProductAbilityTrait {
);
$named = array();
+ _prime_post_caches( array_filter( array_map( static fn( $item ) => (int) ( $item['id'] ?? 0 ), $items ) ) );
+
foreach ( array_values( $items ) as $index => $item ) {
$position = $index + 1;
$id = (int) ( $item['id'] ?? 0 );
@@ -945,7 +947,9 @@ trait ProductAbilityTrait {
$combinations = array();
$parent_sku = $parent_product->get_sku( 'edit' );
$skus = '' === $parent_sku ? array() : array( $parent_sku => true );
- foreach ( $parent_product->get_id() > 0 ? self::read_variation_children( $parent_product, true )['all'] : array() as $child_id ) {
+ $child_ids = $parent_product->get_id() > 0 ? self::read_variation_children( $parent_product, true )['all'] : array();
+ _prime_post_caches( $child_ids );
+ foreach ( $child_ids as $child_id ) {
$child = isset( $named[ $child_id ] ) ? null : wc_get_product( $child_id );
if ( $child instanceof \WC_Product_Variation ) {
$combinations[ self::get_variation_combination( $child ) ] = true;