before any tags load add_action('wp_head', [$this, 'outputGcmV2Header'], 1); add_action('wp_footer', [$this, 'outputCmpBridgeScript'], 95); } /** * Outputs the shared consent helper. */ public function outputConsentHelper(): void { // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Static inline script echo $this->renderConsentHelper(); } /** * Renders window.wpZbridgeConsent, which passes consent to Zaraz: * Google Consent Mode v2 via zaraz.set(), and Zaraz consent purposes via zaraz.consent.set(). * * @return string */ public function renderConsentHelper(): string { $purposes = wp_json_encode([ 'analytics' => self::PURPOSE_ANALYTICS, 'marketing' => self::PURPOSE_MARKETING, ]); ob_start(); ?> renderGcmV2Script(); } /** * Generates GCM v2 script tag. * * @return string */ public function renderGcmV2Script(): string { $adStorage = (Options::get('gcm_ad_storage_default', 'denied') === 'granted') ? 'granted' : 'denied'; $analyticsStorage = (Options::get('gcm_analytics_default', 'denied') === 'granted') ? 'granted' : 'denied'; $defaults = [ 'ad_storage' => $adStorage, 'analytics_storage' => $analyticsStorage, 'ad_user_data' => $adStorage, 'ad_personalization' => $adStorage, 'wait_for_update' => 500, ]; $encodedDefaults = wp_json_encode($defaults); unset($defaults['wait_for_update']); $zarazDefaults = wp_json_encode($defaults); $out = "\n"; return $out; } /** * Injects bridge script listening to 3rd-party CMP events (Complianz, Cookiebot, CookieYes, Borlabs Cookie, WP Consent API). */ public function outputCmpBridgeScript(): void { ?>