Commit 8bfc1083018 for woocommerce

commit 8bfc1083018526c9ee494369fd1d7f256b297476
Author: Karol Manijak <20098064+kmanijak@users.noreply.github.com>
Date:   Wed Jul 22 14:46:31 2026 +0200

    Restore rel key in loop add-to-cart filter arguments (#66856)

    * Restore loop add-to-cart rel filter compatibility

    * Add changelog comment for rel filter compatibility

diff --git a/plugins/woocommerce/changelog/fix-loop-add-to-cart-rel-compat b/plugins/woocommerce/changelog/fix-loop-add-to-cart-rel-compat
new file mode 100644
index 00000000000..c26447e74d6
--- /dev/null
+++ b/plugins/woocommerce/changelog/fix-loop-add-to-cart-rel-compat
@@ -0,0 +1,3 @@
+Significance: patch
+Type: fix
+Comment: This is a compatibility follow-up to #66743. The user-facing change is already covered by its existing changelog entry.
diff --git a/plugins/woocommerce/includes/wc-template-functions.php b/plugins/woocommerce/includes/wc-template-functions.php
index 5d9b60ffe36..c2d95781cc8 100644
--- a/plugins/woocommerce/includes/wc-template-functions.php
+++ b/plugins/woocommerce/includes/wc-template-functions.php
@@ -1461,6 +1461,7 @@ if ( ! function_exists( 'woocommerce_template_loop_add_to_cart' ) ) {
 			'data-product_id'  => $product->get_id(),
 			'data-product_sku' => $product->get_sku(),
 			'aria-label'       => $product->add_to_cart_description(),
+			'rel'              => '',
 		);

 		if ( $product->get_permalink() !== $product->add_to_cart_url() ) {
diff --git a/plugins/woocommerce/src/Blocks/BlockTypes/ProductButton.php b/plugins/woocommerce/src/Blocks/BlockTypes/ProductButton.php
index 4f6f0f92839..e865ec849f4 100644
--- a/plugins/woocommerce/src/Blocks/BlockTypes/ProductButton.php
+++ b/plugins/woocommerce/src/Blocks/BlockTypes/ProductButton.php
@@ -168,6 +168,7 @@ class ProductButton extends AbstractBlock {
 			$add_to_cart_url = $product->add_to_cart_url();
 			$attributes      = array(
 				'href' => esc_url( $add_to_cart_url ),
+				'rel'  => '',
 			);

 			if ( $product->get_permalink() !== $add_to_cart_url ) {
diff --git a/plugins/woocommerce/tests/php/includes/wc-template-functions-test.php b/plugins/woocommerce/tests/php/includes/wc-template-functions-test.php
index 82f729cb421..4719fbc1473 100644
--- a/plugins/woocommerce/tests/php/includes/wc-template-functions-test.php
+++ b/plugins/woocommerce/tests/php/includes/wc-template-functions-test.php
@@ -179,7 +179,30 @@ class WC_Template_Functions_Tests extends \WC_Unit_Test_Case {
 		$markup  = $this->render_loop_add_to_cart( $product );

 		$this->assertStringContainsString( 'href="' . esc_url( $product->get_permalink() ) . '"', $markup );
-		$this->assertStringNotContainsString( 'rel="nofollow"', $markup );
+		$this->assertStringContainsString( 'rel=""', $markup );
+	}
+
+	/**
+	 * @testdox Loop button filter arguments retain an empty rel attribute for product permalink links.
+	 */
+	public function test_loop_button_product_permalink_filter_args_include_empty_rel(): void {
+		$product       = WC_Helper_Product::create_variation_product();
+		$filtered_args = null;
+		$filter        = static function ( array $args ) use ( &$filtered_args ): array {
+			$filtered_args = $args;
+			return $args;
+		};
+
+		add_filter( 'woocommerce_loop_add_to_cart_args', $filter );
+		try {
+			$this->render_loop_add_to_cart( $product );
+		} finally {
+			remove_filter( 'woocommerce_loop_add_to_cart_args', $filter );
+		}
+
+		$this->assertIsArray( $filtered_args );
+		$this->assertArrayHasKey( 'rel', $filtered_args['attributes'] );
+		$this->assertSame( '', $filtered_args['attributes']['rel'] );
 	}

 	/**
diff --git a/plugins/woocommerce/tests/php/src/Blocks/BlockTypes/ProductButton.php b/plugins/woocommerce/tests/php/src/Blocks/BlockTypes/ProductButton.php
index 2a385f3d04e..870ea066977 100644
--- a/plugins/woocommerce/tests/php/src/Blocks/BlockTypes/ProductButton.php
+++ b/plugins/woocommerce/tests/php/src/Blocks/BlockTypes/ProductButton.php
@@ -65,7 +65,30 @@ class ProductButton extends \WP_UnitTestCase {
 		$markup  = $this->render_product_button( $product );

 		$this->assertStringContainsString( 'href="' . esc_url( $product->get_permalink() ) . '"', $markup );
-		$this->assertStringNotContainsString( 'rel="nofollow"', $markup );
+		$this->assertStringContainsString( 'rel=""', $markup );
+	}
+
+	/**
+	 * @testdox Product Button filter arguments retain an empty rel attribute for product permalink links.
+	 */
+	public function test_product_permalink_filter_args_include_empty_rel(): void {
+		$product       = WC_Helper_Product::create_variation_product();
+		$filtered_args = null;
+		$filter        = static function ( array $args ) use ( &$filtered_args ): array {
+			$filtered_args = $args;
+			return $args;
+		};
+
+		add_filter( 'woocommerce_loop_add_to_cart_args', $filter );
+		try {
+			$this->render_product_button( $product );
+		} finally {
+			remove_filter( 'woocommerce_loop_add_to_cart_args', $filter );
+		}
+
+		$this->assertIsArray( $filtered_args );
+		$this->assertArrayHasKey( 'rel', $filtered_args['attributes'] );
+		$this->assertSame( '', $filtered_args['attributes']['rel'] );
 	}

 	/**