Commit aee4642a23d for woocommerce
commit aee4642a23d58ab08f613a4c912a0b7649a72194
Author: Chi-Hsuan Huang <chihsuan.tw@gmail.com>
Date: Tue Oct 20 16:23:55 2026 +0800
Skip the s.js analytics script when proxy tracking is enabled (#70010)
* Skip s.js when analytics proxy tracking is enabled
* Describe the proxy tracking branch in the tracking script docblock
* Add changelog entry for skipping s.js in proxy tracking mode
* Set in_footer on the proxy tracking handle and sync s.js docblocks
diff --git a/packages/php/woocommerce-analytics/changelog/update-analytics-skip-sjs-proxy-tracking b/packages/php/woocommerce-analytics/changelog/update-analytics-skip-sjs-proxy-tracking
new file mode 100644
index 00000000000..8ec37b50723
--- /dev/null
+++ b/packages/php/woocommerce-analytics/changelog/update-analytics-skip-sjs-proxy-tracking
@@ -0,0 +1,4 @@
+Significance: patch
+Type: changed
+
+Stop loading the stats.wp.com tracking script and its referrer cookies when analytics proxy tracking is enabled.
diff --git a/packages/php/woocommerce-analytics/src/class-woocommerce-analytics.php b/packages/php/woocommerce-analytics/src/class-woocommerce-analytics.php
index 6663b25cd5f..d9e7715defd 100644
--- a/packages/php/woocommerce-analytics/src/class-woocommerce-analytics.php
+++ b/packages/php/woocommerce-analytics/src/class-woocommerce-analytics.php
@@ -66,7 +66,7 @@ class Woocommerce_Analytics {
const PROXY_TRACKING_EVER_ENABLED_OPTION = 'woocommerce_analytics_proxy_tracking_ever_enabled';
/**
- * Script handle for s.js. WordPress prints its tag with the id `{handle}-js`.
+ * Script handle for s.js, registered with no src when proxy tracking is enabled. WordPress prints its tag with the id `{handle}-js`.
*
* @var string
*/
@@ -173,9 +173,16 @@ class Woocommerce_Analytics {
}
/**
- * Place script to call s.js, Store Analytics.
+ * Place script to call s.js, Store Analytics, or only its handle when proxy tracking is enabled.
*/
public static function enqueue_tracking_script() {
+ // Proxy tracking sends events without s.js, which would only set referrer cookies.
+ if ( \Automattic\Woocommerce_Analytics\Features::is_proxy_tracking_enabled() ) {
+ wp_register_script( self::TRACKING_SCRIPT_HANDLE, false, array(), null, false ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion -- There is no src to version.
+ wp_enqueue_script( self::TRACKING_SCRIPT_HANDLE );
+ return;
+ }
+
$url = sprintf(
'https://stats.wp.com/s-%d.js',
gmdate( 'YW' )
diff --git a/packages/php/woocommerce-analytics/src/client/index.ts b/packages/php/woocommerce-analytics/src/client/index.ts
index c192a25b208..c8c0ff457aa 100644
--- a/packages/php/woocommerce-analytics/src/client/index.ts
+++ b/packages/php/woocommerce-analytics/src/client/index.ts
@@ -8,7 +8,7 @@ import { consentManager } from './consent';
import { activateTrackingScript } from './tracking-script';
/**
- * Start tracking. Safe to call again, and s.js sends the events analytics queues in `window._wca` whenever it arrives.
+ * Start tracking. Safe to call again. Without proxy tracking, s.js sends the events analytics queues in `window._wca` whenever it arrives.
*/
function startTracking() {
activateTrackingScript();
diff --git a/packages/php/woocommerce-analytics/tests/php/Tracking_Script_Consent_Test.php b/packages/php/woocommerce-analytics/tests/php/Tracking_Script_Consent_Test.php
index d87cdfad3e4..d9062d8395c 100644
--- a/packages/php/woocommerce-analytics/tests/php/Tracking_Script_Consent_Test.php
+++ b/packages/php/woocommerce-analytics/tests/php/Tracking_Script_Consent_Test.php
@@ -68,6 +68,30 @@ class Tracking_Script_Consent_Test extends BaseTestCase {
$this->assertNotSame( 'text/plain', $dependent['type'] ?? null );
}
+ /**
+ * Test that with proxy tracking, s.js does not print but scripts depending on its handle still do.
+ *
+ * @runInSeparateProcess
+ * @preserveGlobalState disabled
+ */
+ public function test_tracking_script_is_skipped_when_proxy_tracking_is_enabled(): void {
+ require_once __DIR__ . '/mocks/wp-consent-api-functions.php';
+ add_filter( 'woocommerce_analytics_experimental_proxy_tracking_enabled', '__return_true' );
+
+ Woocommerce_Analytics::enqueue_tracking_script();
+ wp_enqueue_script( 'analytics-dependent', 'https://example.com/dependent.js', array( 'woocommerce-analytics' ), '1.0' );
+
+ $output = $this->print_scripts();
+ $dependent = $this->get_script_attributes( $output, 'analytics-dependent-js' );
+
+ $this->assertStringNotContainsString( 'stats.wp.com', $output );
+ $this->assertNull( $this->get_script_attributes( $output, 'woocommerce-analytics-js' ) );
+ $this->assertFalse( has_filter( 'wp_script_attributes', array( Woocommerce_Analytics::class, 'hold_tracking_script_until_consent' ) ) );
+
+ $this->assertIsArray( $dependent );
+ $this->assertSame( 'https://example.com/dependent.js?ver=1.0', $dependent['src'] ?? null );
+ }
+
/**
* Print the enqueued scripts and return the markup.
*