Commit c8b3a0f89da for woocommerce

commit c8b3a0f89daa3035c6caf9d9120c95d1868df4b4
Author: Luigi Teschio <gigitux@gmail.com>
Date:   Wed Oct 21 15:32:52 2026 +0200

    Fix Interactivity API directive IDs for WordPress 7.2 (#70076)

    * Fix deprecated Interactivity API lifecycle directive IDs

    * Add changelog for Interactivity API compatibility fix

diff --git a/plugins/woocommerce/changelog/fix-interactivity-api-lifecycle-directive-ids b/plugins/woocommerce/changelog/fix-interactivity-api-lifecycle-directive-ids
new file mode 100644
index 00000000000..47c58d8e24f
--- /dev/null
+++ b/plugins/woocommerce/changelog/fix-interactivity-api-lifecycle-directive-ids
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Restore product galleries, filters, Mini-Cart updates, and product option validation on WordPress 7.2.
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/AddToCartWithOptions/VariationSelector.php b/plugins/woocommerce/src/Blocks/BlockTypes/AddToCartWithOptions/VariationSelector.php
index 9350db9fb85..4978c68464f 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/AddToCartWithOptions/VariationSelector.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/AddToCartWithOptions/VariationSelector.php
@@ -37,7 +37,7 @@ class VariationSelector extends AbstractBlock {

 			if ( $p->next_tag( array( 'class_name' => 'wp-block-woocommerce-add-to-cart-with-options-variation-selector' ) ) ) {
 				$p->set_attribute( 'data-wp-watch', 'callbacks.setSelectedVariationId' );
-				$p->set_attribute( 'data-wp-watch--validate', 'callbacks.validateVariation' );
+				$p->set_attribute( 'data-wp-watch---validate', 'callbacks.validateVariation' );
 			}

 			return $p->get_updated_html();
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/MiniCart.php b/plugins/woocommerce/src/Blocks/BlockTypes/MiniCart.php
index 4013f6261db..626084c89bc 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/MiniCart.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/MiniCart.php
@@ -406,7 +406,7 @@ class MiniCart extends AbstractBlock {
 				data-wp-on-document--wc-blocks_added_to_cart---open-drawer="actions.openDrawer"
 				<?php endif; ?>
 				data-wp-watch="callbacks.disableScrollingOnBody"
-				data-wp-init--mark-as-hydrated="callbacks.markAsHydrated"
+				data-wp-init---mark-as-hydrated="callbacks.markAsHydrated"
 				<?php // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
 				<?php echo wp_interactivity_data_wp_context( $context ); ?>
 				class="<?php echo esc_attr( $wrapper_classes ); ?>"
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/ProductFilterChips.php b/plugins/woocommerce/src/Blocks/BlockTypes/ProductFilterChips.php
index eff9bfa08cb..ec75e3732b7 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/ProductFilterChips.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/ProductFilterChips.php
@@ -82,9 +82,9 @@ final class ProductFilterChips extends AbstractBlock {
 		);

 		$wrapper_attributes = array(
-			'data-wp-interactive'  => 'woocommerce/product-filter-chips',
-			'data-wp-init--colors' => 'callbacks.initColors',
-			'data-wp-context'      => (string) wp_json_encode(
+			'data-wp-interactive'   => 'woocommerce/product-filter-chips',
+			'data-wp-init---colors' => 'callbacks.initColors',
+			'data-wp-context'       => (string) wp_json_encode(
 				array(
 					'storeNamespace' => $store_namespace,
 					'displayLimit'   => $display_limit,
@@ -92,7 +92,7 @@ final class ProductFilterChips extends AbstractBlock {
 				),
 				JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP
 			),
-			'class'                => esc_attr( $classes ),
+			'class'                 => esc_attr( $classes ),
 		);

 		if ( ! empty( $style ) ) {
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/ProductFilters.php b/plugins/woocommerce/src/Blocks/BlockTypes/ProductFilters.php
index fe9ff651d18..92422ce73a5 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/ProductFilters.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/ProductFilters.php
@@ -233,17 +233,17 @@ CSS;
 		}

 		$wrapper_attributes = array(
-			'class'                         => implode( ' ', $wrapper_classes ),
-			'data-wp-router-region'         => $this->generate_navigation_id( $block ),
-			'data-wp-interactive'           => $this->get_full_block_name(),
-			'data-wp-init--colors'          => 'callbacks.initColors',
-			'data-wp-watch--active-filters' => 'callbacks.syncActiveFiltersWithServer',
-			'data-wp-context'               => (string) wp_json_encode( $interactivity_context, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ),
-			'style'                         => $this->get_css_variables( $attributes ),
+			'class'                          => implode( ' ', $wrapper_classes ),
+			'data-wp-router-region'          => $this->generate_navigation_id( $block ),
+			'data-wp-interactive'            => $this->get_full_block_name(),
+			'data-wp-init---colors'          => 'callbacks.initColors',
+			'data-wp-watch---active-filters' => 'callbacks.syncActiveFiltersWithServer',
+			'data-wp-context'                => (string) wp_json_encode( $interactivity_context, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ),
+			'style'                          => $this->get_css_variables( $attributes ),
 		);

 		if ( $has_overlay ) {
-			$wrapper_attributes['data-wp-watch--scrolling']         = 'callbacks.scrollLimit';
+			$wrapper_attributes['data-wp-watch---scrolling']        = 'callbacks.scrollLimit';
 			$wrapper_attributes['data-wp-on--keyup']                = 'actions.closeOverlayOnEscape';
 			$wrapper_attributes['data-wp-class--is-overlay-opened'] = 'context.isOverlayOpened';
 		}
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/ProductGallery.php b/plugins/woocommerce/src/Blocks/BlockTypes/ProductGallery.php
index c0cf46ca8ef..a5d07c6b883 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/ProductGallery.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/ProductGallery.php
@@ -314,7 +314,7 @@ class ProductGallery extends AbstractBlock {
 					);

 					// Support legacy Add to Cart with Options block.
-					$p->set_attribute( 'data-wp-init--watch-changes-on-add-to-cart-form', 'callbacks.watchForChangesOnAddToCartForm' );
+					$p->set_attribute( 'data-wp-init---watch-changes-on-add-to-cart-form', 'callbacks.watchForChangesOnAddToCartForm' );
 					// Support blockified Add to Cart + Options block.
 					$p->set_attribute( 'data-wp-watch', 'callbacks.listenToProductDataChanges' );
 				}
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/ProductGalleryThumbnails.php b/plugins/woocommerce/src/Blocks/BlockTypes/ProductGalleryThumbnails.php
index c15b0f1871a..40d3cc84cc2 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/ProductGalleryThumbnails.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/ProductGalleryThumbnails.php
@@ -83,8 +83,8 @@ class ProductGalleryThumbnails extends AbstractBlock {
 			data-wp-class--wc-block-product-gallery-thumbnails--overflow-right="context.thumbnailsOverflow.right">
 			<div
 				class="wc-block-product-gallery-thumbnails__scrollable"
-				data-wp-init--init-resize-observer="callbacks.initResizeObserver"
-				data-wp-init--hide-ghost-overflow="callbacks.hideGhostOverflow"
+				data-wp-init---init-resize-observer="callbacks.initResizeObserver"
+				data-wp-init---hide-ghost-overflow="callbacks.hideGhostOverflow"
 				data-wp-on--scroll="actions.onScroll"
 				aria-label="<?php esc_attr_e( 'Image thumbnails', 'woocommerce' ); ?>"
 				role="listbox">
diff --git a/plugins/woocommerce/src/Blocks/Utils/ProductGalleryUtils.php b/plugins/woocommerce/src/Blocks/Utils/ProductGalleryUtils.php
index c5600d36051..13878f6fc5c 100644
--- a/plugins/woocommerce/src/Blocks/Utils/ProductGalleryUtils.php
+++ b/plugins/woocommerce/src/Blocks/Utils/ProductGalleryUtils.php
@@ -208,7 +208,7 @@ class ProductGalleryUtils {

 		if ( 'dialog' === $video_location ) {
 			unset( $attrs['autoplay'] );
-			$attrs['data-wp-init--dialog-video-playback'] = 'callbacks.initDialogVideoPlayback';
+			$attrs['data-wp-init---dialog-video-playback'] = 'callbacks.initDialogVideoPlayback';
 		}

 		if ( ! empty( $media['poster_id'] ) && ! empty( $media['poster_src'] ) ) {