From 7059c45e20e8daf067e7f07e4907118b5998586a Mon Sep 17 00:00:00 2001 From: Steve Hanlon Date: Tue, 10 Mar 2026 12:09:49 +0000 Subject: [PATCH] Improve cross-domain tracking and add "Always" script category Move linker config into gtag('config') call with accept_incoming and decorate_forms for reliable cross-domain linking. Capture _gl parameter in sessionStorage to preserve attribution across navigation. Add referrer-based attribution replay fallback so GA4 reports source/medium instead of (not set) when UTMs are absent. Add "Always" script category that executes without waiting for consent. Co-Authored-By: Claude Opus 4.6 --- admin/css/admin.css | 1 + admin/views/settings-scripts.php | 3 ++- includes/class-frontend.php | 6 +++--- includes/class-scripts-manager.php | 15 ++++++++++++++- public/js/consent-manager.js | 23 +++++++++++++++++++++++ 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/admin/css/admin.css b/admin/css/admin.css index ff608e6..e9270d0 100644 --- a/admin/css/admin.css +++ b/admin/css/admin.css @@ -28,6 +28,7 @@ color: #fff; } +.att-cc-badge--always { background: #4CAF50; } .att-cc-badge--functional { background: #2196F3; } .att-cc-badge--analytics { background: #FF9800; } .att-cc-badge--marketing { background: #9C27B0; } diff --git a/admin/views/settings-scripts.php b/admin/views/settings-scripts.php index 9691b20..a0468bc 100644 --- a/admin/views/settings-scripts.php +++ b/admin/views/settings-scripts.php @@ -82,11 +82,12 @@ $scripts = ATT_Consent_Scripts_Manager::get_all_scripts(); -

+

diff --git a/includes/class-frontend.php b/includes/class-frontend.php index eeb0a4b..7bba363 100644 --- a/includes/class-frontend.php +++ b/includes/class-frontend.php @@ -115,7 +115,6 @@ wait_for_update:c.wait_for_update||500 }); window.attCCHasConsent=false; } -if(c.linker_domains&&c.linker_domains.length){g('set','linker',{'domains':c.linker_domains});} if(!sessionStorage.getItem('att_cc_attr')){ var p=new URLSearchParams(window.location.search); var a={ @@ -128,9 +127,10 @@ ut:p.get('utm_term')||'', uo:p.get('utm_content')||'', gc:p.get('gclid')||'', dc:p.get('dclid')||'', +gl:p.get('_gl')||'', t:Date.now() }; -if(a.r||a.us||a.gc){ +if(a.r||a.us||a.gc||a.gl){ sessionStorage.setItem('att_cc_attr',JSON.stringify(a)); } } @@ -176,7 +176,7 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= if ( 'gtag' === $s['tracking_mode'] && ! empty( $s['ga4_measurement_id'] ) ) { $id = esc_attr( $s['ga4_measurement_id'] ); return " -"; +"; } return ''; diff --git a/includes/class-scripts-manager.php b/includes/class-scripts-manager.php index ba1a673..fb147e2 100644 --- a/includes/class-scripts-manager.php +++ b/includes/class-scripts-manager.php @@ -97,7 +97,7 @@ class ATT_Consent_Scripts_Manager { global $wpdb; $table = self::table_name(); - $allowed_categories = array( 'functional', 'analytics', 'marketing' ); + $allowed_categories = array( 'always', 'functional', 'analytics', 'marketing' ); $allowed_placements = array( 'head', 'footer' ); $allowed_statuses = array( 'active', 'inactive' ); @@ -150,6 +150,7 @@ class ATT_Consent_Scripts_Manager { public static function get_scripts_for_frontend() { $scripts = self::get_scripts(); $grouped = array( + 'always' => array( 'head' => array(), 'footer' => array() ), 'functional' => array( 'head' => array(), 'footer' => array() ), 'analytics' => array( 'head' => array(), 'footer' => array() ), 'marketing' => array( 'head' => array(), 'footer' => array() ), @@ -193,6 +194,18 @@ class ATT_Consent_Scripts_Manager { continue; } + // "Always" scripts execute immediately without consent gating. + if ( 'always' === $script['category'] ) { + if ( preg_match( '/]/i', $snippet ) ) { + $output .= $snippet . "\n"; + } elseif ( preg_match( '/^\s*' . $snippet . '' . "\n"; + } + continue; + } + // Check if snippet contains