Changeset 3453704
- Timestamp:
- 02/04/2026 10:37:47 AM (5 weeks ago)
- Location:
- metrion
- Files:
-
- 60 added
- 11 edited
-
tags/1.6.0 (added)
-
tags/1.6.0/assets (added)
-
tags/1.6.0/assets/icon-128x128.png (added)
-
tags/1.6.0/assets/icon-256x256.png (added)
-
tags/1.6.0/css (added)
-
tags/1.6.0/css/settings.css (added)
-
tags/1.6.0/includes (added)
-
tags/1.6.0/includes/api_endpoints.php (added)
-
tags/1.6.0/includes/event_capture.php (added)
-
tags/1.6.0/includes/initial.php (added)
-
tags/1.6.0/includes/js_bundler.php (added)
-
tags/1.6.0/js (added)
-
tags/1.6.0/js/cmp (added)
-
tags/1.6.0/js/cmp/cmplz (added)
-
tags/1.6.0/js/cmp/cmplz/logic.js (added)
-
tags/1.6.0/js/cmp/cookiebot (added)
-
tags/1.6.0/js/cmp/cookiebot/logic.js (added)
-
tags/1.6.0/js/cmp/cookieconfirm (added)
-
tags/1.6.0/js/cmp/cookieconfirm/logic.js (added)
-
tags/1.6.0/js/cmp/cookiefirst (added)
-
tags/1.6.0/js/cmp/cookiefirst/logic.js (added)
-
tags/1.6.0/js/cmp/cookiepal (added)
-
tags/1.6.0/js/cmp/cookiepal/logic.js (added)
-
tags/1.6.0/js/cmp/cookieyes (added)
-
tags/1.6.0/js/cmp/cookieyes/logic.js (added)
-
tags/1.6.0/js/cmp/moove_gdpr (added)
-
tags/1.6.0/js/cmp/moove_gdpr/logic.js (added)
-
tags/1.6.0/js/cmp/no_cmp (added)
-
tags/1.6.0/js/cmp/no_cmp/logic.js (added)
-
tags/1.6.0/js/cmp/onetrust (added)
-
tags/1.6.0/js/cmp/onetrust/logic.js (added)
-
tags/1.6.0/js/core (added)
-
tags/1.6.0/js/core/events.js (added)
-
tags/1.6.0/js/core/initialisation_sequence.js (added)
-
tags/1.6.0/js/detect (added)
-
tags/1.6.0/js/detect/detect.js (added)
-
tags/1.6.0/js/elementor (added)
-
tags/1.6.0/js/elementor/form_events.js (added)
-
tags/1.6.0/js/google_ads (added)
-
tags/1.6.0/js/google_ads/consent_mode.js (added)
-
tags/1.6.0/js/google_ads/events.js (added)
-
tags/1.6.0/js/google_analytics (added)
-
tags/1.6.0/js/google_analytics/events.js (added)
-
tags/1.6.0/js/meta (added)
-
tags/1.6.0/js/meta/events.js (added)
-
tags/1.6.0/js/microsoft_ads (added)
-
tags/1.6.0/js/microsoft_ads/consent_mode.js (added)
-
tags/1.6.0/js/microsoft_ads/events.js (added)
-
tags/1.6.0/js/settings (added)
-
tags/1.6.0/js/settings/settings.js (added)
-
tags/1.6.0/js/tiktok (added)
-
tags/1.6.0/js/tiktok/events.js (added)
-
tags/1.6.0/js/woo (added)
-
tags/1.6.0/js/woo/other_events.js (added)
-
tags/1.6.0/js/woo/purchase_event.js (added)
-
tags/1.6.0/main.php (added)
-
tags/1.6.0/readme.txt (added)
-
tags/1.6.0/uninstall.php (added)
-
tags/1.6.0/views (added)
-
tags/1.6.0/views/settings.php (added)
-
trunk/includes/event_capture.php (modified) (6 diffs)
-
trunk/includes/initial.php (modified) (5 diffs)
-
trunk/includes/js_bundler.php (modified) (7 diffs)
-
trunk/js/core/events.js (modified) (1 diff)
-
trunk/js/google_ads/events.js (modified) (6 diffs)
-
trunk/js/meta/events.js (modified) (3 diffs)
-
trunk/js/tiktok/events.js (modified) (4 diffs)
-
trunk/main.php (modified) (5 diffs)
-
trunk/readme.txt (modified) (2 diffs)
-
trunk/uninstall.php (modified) (4 diffs)
-
trunk/views/settings.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
metrion/trunk/includes/event_capture.php
r3452105 r3453704 19 19 } 20 20 21 add_action('wp_head', function() {22 if (!is_wc_endpoint_url('order-received')) return;23 24 $order_id = absint(get_query_var('order-received'));25 if (!$order_id) return;26 27 // Always print the echo script for debug28 metrion_echo_webhook_purchase($order_id, 'wp_head_force_echo');29 });30 31 21 // Add tracking function to both hooks with appropriate source information 32 22 add_action('woocommerce_checkout_order_processed', function($order_id) { … … 41 31 metrion_order_cancelled_tracking($order_id, 'woocommerce_cancelled_order'); 42 32 }, 10, 1); 43 44 /**45 * Returns an array that can be used to sanitize a <script> block using wp_kses().46 *47 * @return array48 */49 function metrion_sanitize_script_block_rules() {50 return array(51 'script' => array(52 'data-cfasync' => array(),53 'data-pagespeed-no-defer' => array(),54 'data-cookieconsent' => array(),55 'type' => array(),56 'nonce' => array(),57 ),58 );59 }60 61 function metrion_generate_script_opening_tag() {62 $has_html5_support = current_theme_supports( 'html5' );63 $add_cookiebot_ignore = false;64 $csp_nonce = apply_filters( GET_METRION_WPFILTER_CSP_NONCE, '' );65 return '<script data-cfasync="false" data-pagespeed-no-defer' . ( $has_html5_support ? '' : ' type="text/javascript"' ) . ( $add_cookiebot_ignore ? ' data-cookieconsent="ignore"' : '' ) . ( $csp_nonce ? ' nonce="' . esc_attr( $csp_nonce ) . '"' : '' ) . '>';66 }67 68 function metrion_echo_webhook_purchase($order_id, $triggered_by_hook = '') {69 // Get the base order object70 $order = wc_get_order($order_id);71 if ( ! $order instanceof WC_Order ) {72 return;73 }74 // conversion details75 $google_ads_tag_id = get_option('metrion_google_ads_tag_id', '');76 $google_ads_conversion_label = get_option('metrion_google_ads_purchase_enhanced_conversion_label', '');77 78 $order_total = $order->get_total();79 $currency = $order->get_currency();80 $transaction_id = $order->get_id();81 82 $metrion_consent_cookie_value = metrion_get_cookie_value('metrion_consent_cookie_name', 'mtrn_consent');83 $allow_marketing = isset($metrion_consent_cookie_value['allow_marketing']) && $metrion_consent_cookie_value['allow_marketing'] === "1";84 85 $script_tag = "" . metrion_generate_script_opening_tag() . "86 document.addEventListener('DOMContentLoaded', function() {87 window.metrion = window.metrion || {};88 window.metrion_api = window.metrion_api || {};89 window.metrion.google_ads = window.metrion.google_ads || {};90 window.metrion.google_ads.purchase_triggered = window.metrion.google_ads.purchase_triggered || false;91 if(window.metrion.google_ads.purchase_triggered === false){92 window.metrion.google_ads.purchase_echo_loaded = true;93 window.metrion.google_ads.purchase_echo_triggered = false;94 window.metrion.google_ads.google_ads_purchase_enhanced_conversion_label = '" . esc_js($google_ads_conversion_label) . "';95 window.metrion.google_ads.google_ads_tag_id = '" . esc_js($google_ads_tag_id ) . "';96 window.metrion.google_ads.order_id = '" . esc_js($transaction_id) . "';97 // Initialize the Google Ads tracking script98 window.metrion.google_ads.echo_direct = function(){99 // Conditionally start with the handling100 function start_google_ads_event_handling(){101 window.gtag('event', 'conversion', {102 'send_to': (window.metrion.google_ads.google_ads_tag_id + '/' + window.metrion.google_ads.google_ads_purchase_enhanced_conversion_label),103 'value': " . esc_js($order_total) . ",104 'currency': '" . esc_js($currency) . "',105 'transaction_id': '" . esc_js($transaction_id) . "'106 });107 window.metrion.google_ads.purchase_triggered = true;108 window.metrion.google_ads.purchase_echo_triggered = true;109 }110 111 if(typeof window.metrion === 'undefined' && typeof window.metrion_api === 'undefined'){112 window.metrion.google_ads.metrion_not_available = true;113 }114 else{115 // GOOGLE ADS CONTEXT CHECKS116 // First Check if recent relevant click-ids are stored117 var google_ads_click_id = undefined;118 try{119 //Parse the cookie if it exists120 var parsed_click_ids = JSON.parse(decodeURIComponent(window.metrion.helpers.get_cookie_value(window.metrion_api.click_ids_cookie_name)));121 if(parsed_click_ids !== null && typeof parsed_click_ids.gclid !== 'undefined'){122 google_ads_click_id = parsed_click_ids.gclid;123 }124 }catch(e){};125 126 // If block dectection is not enabled set the value to undefined to remove the variable from the conversion127 var block_detected = '0';128 129 try{130 //Parse the cookie if it exists131 var parsed_consent = JSON.parse(decodeURIComponent(window.metrion.helpers.get_cookie_value(window.metrion_api.consent_cookie_name)));132 if(parsed_consent !== null && typeof parsed_consent.b !== 'undefined'){133 block_detected = parsed_consent.b;134 }135 }catch(e){};136 137 // Allways send enhanced conversion event for deduplication138 // If this event does not exist, this gtag script has failed.139 // If this event contains a blocking intent (1), don't deduplicate for untagged conversions140 window.metrion.helpers.log_debug('Google Ads conversion send through echo', 'log');141 window.metrion.send_event('google_ads_gtag_purchase_triggered', {142 'send_to': (window.metrion_api.google_ads_tag_id + '/' + window.metrion_api.google_ads_purchase_enhanced_conversion_label),143 'value': " . esc_js($order_total) . ",144 'currency': '" . esc_js($currency) . "',145 'transaction_id': '" . esc_js($transaction_id) . "',146 'gclid': google_ads_click_id,147 'enable_detection': window.metrion_api.enable_detection,148 'b': block_detected,149 'trigger_type': 'front-end',150 'trigger_mechanism': 'echo',151 'non_interaction': '1'152 }, {});153 }154 155 if(typeof window.gtag === 'undefined'){156 // Pre-define before loading gtag.js157 window.dataLayer = window.dataLayer || [];158 window.gtag = window.gtag || function(){ dataLayer.push(arguments); };159 160 // Dynamically and Async loading of gtag script161 var gtag_script = document.createElement('script');162 gtag_script.async = true;163 gtag_script.src = 'https://www.googletagmanager.com/gtag/js?id=' + window.metrion_api.google_ads_tag_id;164 document.body.appendChild(gtag_script);165 166 // Onload just initializes config and conversion167 gtag_script.onload = function() {168 window.gtag('js', new Date());169 window.gtag('config', window.metrion_api.google_ads_tag_id);170 start_google_ads_event_handling();171 };172 }173 else{174 window.gtag('js', new Date());175 window.gtag('config', (window.metrion.google_ads.google_ads_tag_id));176 start_google_ads_event_handling();177 }178 };179 window.metrion.google_ads.echo_direct();180 }181 182 });183 </script>";184 echo htmlspecialchars_decode( //phpcs:ignore185 wp_kses(186 $script_tag,187 metrion_sanitize_script_block_rules()188 )189 );190 }191 192 33 193 34 function metrion_woocommerce_webhook_purchase($order_id, $triggered_by_hook = '') { … … 493 334 'api_path_part_2' => get_option('metrion_api_path_part_2', 'event'), 494 335 'debug_mode' => get_option('metrion_debug_mode', '0'), 336 'metrion_vat_included' => get_option('metrion_vat_included', true), 337 'metrion_shipping_costs_included' => get_option('metrion_shipping_costs_included', true), 495 338 496 339 // Consent information … … 508 351 509 352 // Google Ads specific config 510 'google_enable_tracking' => get_option('metrion_google_enable_tracking', false), 511 'google_ads_account_id' => get_option('metrion_google_ads_account_id', 'NA'), 512 'enable_google_enhanced_conversions' => get_option('metrion_enable_google_ads_enhanced_conversions', false), 513 'google_ads_tag_id' => get_option('metrion_google_ads_tag_id', ''), 514 'google_ads_purchase_enhanced_conversion_label' => get_option('metrion_google_ads_purchase_enhanced_conversion_label', ''), 353 'metrion_google_ads_syncs' => json_decode(get_option('metrion_google_ads_syncs', '[]'), true), 515 354 'enforce_google_consent_mode' => get_option('metrion_enforce_google_consent_mode', false), 516 'enable_google_ads_dynamic_remarketing' => get_option('metrion_enable_google_ads_dynamic_remarketing', false),517 355 518 356 // Meta Ads specific config 519 'meta_enable_tracking' => get_option('metrion_meta_enable_tracking', false), 520 'meta_pixel_id' => get_option('metrion_meta_pixel_id', ''), 521 'meta_capi_token' => get_option('metrion_meta_capi_token', ''), 357 'metrion_meta_ads_syncs' => json_decode(get_option('metrion_meta_ads_syncs', '[]'), true), 522 358 523 359 // Microsoft Ads specific config … … 530 366 'google_analytics_enable_tracking' => get_option('metrion_google_analytics_enable_tracking', 0), 531 367 'google_analytics_measurement_id' => get_option('metrion_google_analytics_measurement_id', ''), 532 'google_analytics_api_secret' => get_option('metrion_google_analytics_api_secret', '') 368 'google_analytics_api_secret' => get_option('metrion_google_analytics_api_secret', ''), 369 370 // TikTok Ads specific config 371 'metrion_tiktok_ads_syncs' => json_decode(get_option('metrion_tiktok_ads_syncs', '[]'), true) 533 372 ); 534 373 } … … 557 396 } 558 397 398 $order_total = floatval($order->get_total()); 399 $order_tax = floatval($order->get_total_tax()); 400 $shipping_excl_tax = floatval($order->get_shipping_total()); 401 $shipping_tax = floatval($order->get_shipping_tax()); 402 $shipping_incl_tax = $shipping_excl_tax + $shipping_tax; 403 559 404 // Initialize purchase data 560 405 $purchase_data = [ 561 406 'order_id' => $order->get_id(), 562 407 'order_total' => $order->get_total(), 408 'order_total_tax' => $order->get_total_tax(), 409 'order_total_shipping' => $order->get_shipping_total(), 563 410 'currency' => $order->get_currency(), 564 411 'items' => [], -
metrion/trunk/includes/initial.php
r3452105 r3453704 68 68 'api_path_part_2' => get_option('metrion_api_path_part_2', 'event'), 69 69 'debug_mode' => get_option('metrion_debug_mode', 0), 70 'metrion_vat_included' => get_option('metrion_vat_included', true), 71 'metrion_shipping_costs_included' => get_option('metrion_shipping_costs_included', true), 70 72 71 73 // Consent manager settings … … 83 85 84 86 // Google Ads settings 85 ' google_enable_tracking' => get_option('metrion_google_enable_tracking', 0),87 'metrion_google_ads_syncs' => json_decode(get_option('metrion_google_ads_syncs', '[]'), true), 86 88 'google_enforce_consent_mode' => get_option('metrion_enforce_google_consent_mode', 0), 87 'metrion_google_ads_purchase_enhanced_conversion_label' => get_option('metrion_google_ads_purchase_enhanced_conversion_label', ''),88 'metrion_google_ads_tag_id' => get_option('metrion_google_ads_tag_id', ''),89 'google_ads_account_id' => get_option('metrion_google_ads_account_id', ''),90 'google_enable_enhanced_conversions' => get_option('metrion_enable_google_ads_enhanced_conversions', 0),91 'google_ads_enable_dynamic_remarketing' => get_option('metrion_enable_google_ads_dynamic_remarketing', 0),92 89 93 90 // Meta settings 94 'meta_enable_tracking' => get_option('metrion_meta_enable_tracking', 0), 95 'meta_pixel_id' => get_option('metrion_meta_pixel_id', ''), 96 'meta_capi_token' => get_option('metrion_meta_capi_token', ''), 91 'metrion_meta_ads_syncs' => json_decode(get_option('metrion_meta_ads_syncs', '[]'), true), 97 92 'meta_test_event_code' => get_option('metrion_meta_test_event_code', ''), 98 93 … … 104 99 'google_analytics_enable_tracking' => get_option('metrion_google_analytics_enable_tracking', 0), 105 100 'google_analytics_measurement_id' => get_option('metrion_google_analytics_measurement_id', ''), 106 'google_analytics_api_secret' => get_option('metrion_google_analytics_api_secret', '') 101 'google_analytics_api_secret' => get_option('metrion_google_analytics_api_secret', ''), 102 103 // TikTok Ads settings 104 'metrion_tiktok_ads_syncs' => json_decode(get_option('metrion_tiktok_ads_syncs', '[]'), true), 107 105 ]; 108 106 } … … 616 614 'onetrust_marketing_code' => get_option('metrion_onetrust_marketing_code', 'C0004'), 617 615 'onetrust_analytics_code' => get_option('metrion_onetrust_analytics_code', 'C0002'), 618 'google_enable_tracking' => get_option('metrion_google_enable_tracking', 0),619 616 'enforce_google_consent_mode' => get_option('metrion_enforce_google_consent_mode', 0), 620 'google_ads_purchase_enhanced_conversion_label' => get_option('metrion_google_ads_purchase_enhanced_conversion_label', ''), 621 'google_ads_tag_id' => get_option('metrion_google_ads_tag_id', ''), 622 'google_ads_account_id' => get_option('metrion_google_ads_account_id', ''), 623 'google_enable_enhanced_conversions' => get_option('metrion_enable_google_ads_enhanced_conversions', 0), 624 'google_ads_enable_dynamic_remarketing' => get_option('metrion_enable_google_ads_dynamic_remarketing', 0), 625 'meta_enable_tracking' => get_option('metrion_meta_enable_tracking', 0), 626 'meta_allow_front_end_pixel_tracking' => get_option('metrion_meta_allow_front_end_pixel_tracking', 0), 627 'meta_pixel_id' => get_option('metrion_meta_pixel_id', ''), 617 'metrion_google_ads_syncs' => json_decode(get_option('metrion_google_ads_syncs', '[]'), true), 618 'metrion_meta_ads_syncs' => json_decode(get_option('metrion_meta_ads_syncs', '[]'), true), 628 619 'meta_test_event_code' => get_option('metrion_meta_test_event_code', ''), 629 620 'purchase_only_tracking' => get_option('metrion_purchase_only_tracking', 0), … … 639 630 'google_analytics_measurement_id' => get_option('metrion_google_analytics_measurement_id', ''), 640 631 'google_analytics_api_secret' => get_option('metrion_google_analytics_api_secret', ''), 641 ' tiktok_enable_front_end_tracking' => get_option('metrion_tiktok_enable_front_end_tracking', ''),642 ' tiktok_pixel_id' => get_option('metrion_tiktok_pixel_id', ''),643 ' tiktok_test_event_code' => get_option('metrion_tiktok_test_event_code', '')632 'metrion_tiktok_ads_syncs' => json_decode(get_option('metrion_tiktok_ads_syncs', '[]'), true), 633 'metrion_vat_included' => get_option('metrion_vat_included', true), 634 'metrion_shipping_costs_included' => get_option('metrion_shipping_costs_included', true) 644 635 ]); 645 636 } -
metrion/trunk/includes/js_bundler.php
r3443863 r3453704 2 2 3 3 if ( ! defined('ABSPATH') ) exit; // Exit if accessed directly 4 5 /** 6 * Returns the ads syncs option as an array. 7 * 8 * @param string $option_name Option key. 9 * @return array<int, mixed> Always an array. 10 */ 11 function metrion_get_ads_syncs_array($option_name) { 12 $raw = get_option($option_name, '[]'); 13 if (!is_string($raw)) { 14 return []; 15 } 16 $decoded = json_decode($raw, true); 17 return is_array($decoded) ? $decoded : []; 18 } 4 19 5 20 // Hook that runs early in admin (not just when the settings page is shown) … … 116 131 117 132 // Consent modes 118 if ( get_option('metrion_google_enable_tracking', false)&& get_option('metrion_enforce_google_consent_mode', false) === "1") {133 if (count(metrion_get_ads_syncs_array('metrion_google_ads_syncs')) > 0 && get_option('metrion_enforce_google_consent_mode', false) === "1") { 119 134 $source_files[] = $plugin_dir . 'js/google_ads/consent_mode.js'; 120 135 } … … 216 231 217 232 // Consent modes 218 if ( get_option('metrion_google_enable_tracking', false)&& get_option('metrion_enforce_google_consent_mode', false) === "1") {233 if (count(metrion_get_ads_syncs_array('metrion_google_ads_syncs')) > 0 && get_option('metrion_enforce_google_consent_mode', false) === "1") { 219 234 $source_files[] = $plugin_dir . 'js/google_ads/consent_mode.js'; 220 235 } … … 226 241 227 242 // Channel JS 228 if ( get_option('metrion_google_enable_tracking', false)) {243 if (count(metrion_get_ads_syncs_array('metrion_google_ads_syncs')) > 0) { 229 244 $source_files[] = $plugin_dir . 'js/google_ads/events.js'; 230 245 } … … 234 249 } 235 250 236 if ( get_option('metrion_meta_allow_front_end_pixel_tracking', false)) {251 if (count(metrion_get_ads_syncs_array('metrion_meta_ads_syncs')) > 0) { 237 252 $source_files[] = $plugin_dir . 'js/meta/events.js'; 238 253 } 239 254 240 if ( get_option('metrion_tiktok_enable_front_end_tracking', false)) {255 if (count(metrion_get_ads_syncs_array('metrion_tiktok_ads_syncs')) > 0) { 241 256 $source_files[] = $plugin_dir . 'js/tiktok/events.js'; 242 257 } … … 308 323 $source_files = []; 309 324 310 if ( get_option('metrion_google_enable_tracking', false)) {325 if (count(metrion_get_ads_syncs_array('metrion_google_ads_syncs')) > 0) { 311 326 $source_files[] = $plugin_dir . 'js/google_ads/events.js'; 312 327 } … … 316 331 } 317 332 318 if ( get_option('metrion_meta_allow_front_end_pixel_tracking', false)) {333 if (count(metrion_get_ads_syncs_array('metrion_meta_ads_syncs')) > 0) { 319 334 $source_files[] = $plugin_dir . 'js/meta/events.js'; 320 335 } 321 322 if ( get_option('metrion_tiktok_enable_front_end_tracking', false)) {336 337 if (count(metrion_get_ads_syncs_array('metrion_tiktok_ads_syncs')) > 0) { 323 338 $source_files[] = $plugin_dir . 'js/tiktok/events.js'; 324 339 } -
metrion/trunk/js/core/events.js
r3452105 r3453704 391 391 } 392 392 return String(value); 393 }, 394 395 clean_url: function (s) { 396 s.replace(/\/$/, '').replace(/^https?:\/\/(www\.)?/, '') 393 397 }, 394 398 }, -
metrion/trunk/js/google_ads/events.js
r3342931 r3453704 24 24 if(window.metrion.configuration.event_broker_queue.length > 0){ 25 25 for(var i=0;i<window.metrion.configuration.event_broker_queue.length;i ++){ 26 // Get the specific event 27 var queued_event = window.metrion.configuration.event_broker_queue[i]; 28 if(!queued_event.triggered_to_google_ads){ 29 queued_event.triggered_to_google_ads = true; 30 window.metrion.google_ads.event_broker_handler(queued_event); 31 // Update the event so it is tagged with the 32 window.metrion.configuration.event_broker_queue[i] = queued_event; 33 } 26 window.metrion.google_ads.event_broker_handler(window.metrion.configuration.event_broker_queue[i]); 34 27 } 35 28 } … … 41 34 } 42 35 43 // Check if gtag exist 44 if(gtag_script_loaded === false || typeof window.gtag === "undefined"){ 45 // Pre-define before loading gtag.js 46 window.dataLayer = window.dataLayer || []; 47 window.gtag = window.gtag || function(){ dataLayer.push(arguments); }; 48 49 // Dynamically and Async loading of gtag script 50 var gtag_script = document.createElement('script'); 51 gtag_script.async = true; 52 gtag_script.src = 'https://www.googletagmanager.com/gtag/js?id=' + window.metrion_api.google_ads_tag_id; 53 document.body.appendChild(gtag_script); 54 55 // Onload just initializes config and conversion 56 gtag_script.onload = function() { 57 window.gtag('js', new Date()); 58 window.gtag('config', window.metrion_api.google_ads_tag_id); 59 start_google_ads_event_handling(); 60 }; 61 } 62 else{ 63 if (!window.metrion.google_ads.check_if_gtag_js_is_already_in_datalayer()) { 64 window.gtag('js', new Date()); 65 } 66 window.gtag('config', (window.metrion_api.google_ads_tag_id)); 67 start_google_ads_event_handling(); 68 } 69 36 for(let sync of window.metrion_api.metrion_google_ads_syncs) { 37 if (!sync.domains.some(domain => window.location.href.includes(window.metrion.helpers.clean_url(domain)))) continue; 38 39 if(gtag_script_loaded === false || typeof window.gtag === "undefined"){ 40 // Pre-define before loading gtag.js 41 window.dataLayer = window.dataLayer || []; 42 window.gtag = window.gtag || function(){ dataLayer.push(arguments); }; 43 44 // Dynamically and Async loading of gtag script 45 var gtag_script = document.createElement('script'); 46 gtag_script.async = true; 47 gtag_script.src = `https://www.googletagmanager.com/gtag/js?id=${sync.tagId}`; 48 document.body.appendChild(gtag_script); 49 50 // Onload just initializes config and conversion 51 gtag_script.onload = function() { 52 window.gtag('js', new Date()); 53 window.gtag('config', sync.tagId); 54 }; 55 } 56 else{ 57 if (!window.metrion.google_ads.check_if_gtag_js_is_already_in_datalayer()) { 58 window.gtag('js', new Date()); 59 } 60 window.gtag('config', sync.tagId); 61 } 62 } 63 64 start_google_ads_event_handling(); 70 65 // End initialization with changing the init variable 71 66 window.metrion.google_ads.initialized = true; … … 113 108 // Override push method to detect new events 114 109 arr.push = function(e) { 115 var google_ads_events_of_interest = [116 //"purchase", > Handled directly in the purchase script outside of broker117 "form_submit"118 ];119 // If Google Ads dynamic remarketing is enabled, add them to the events of interest120 // See list here: https://support.google.com/google-ads/answer/7305793?hl=en121 if(window.metrion_api.google_ads_enable_dynamic_remarketing === "1"){122 google_ads_events_of_interest = google_ads_events_of_interest.concat([123 "view_search_results",124 "view_item",125 "view_item_list",126 "add_to_cart",127 "begin_checkout"128 ])129 }130 131 // Mark events of interest as triggered for Google Ads132 if (typeof e === 'object' && e !== null && google_ads_events_of_interest.indexOf(e.event_name) !== -1) {133 e.triggered_to_google_ads = true;134 }135 136 110 // Call the original push method to maintain normal functionality 137 111 var result = originalPush.apply(arr, arguments); … … 151 125 if(window.metrion_api && window.metrion && typeof window.gtag != "undefined"){ 152 126 153 // ENHANCED PURCHASE 154 // Process purchase events 155 if(event_name === "purchase"){ 156 // Send conversion event to Google Ads 157 window.metrion.google_ads.purchase_triggered = window.metrion.google_ads.purchase_triggered || false; 158 if(window.metrion.google_ads.purchase_triggered === false){ 127 var google_ads_click_id = undefined; 128 try{ 129 var parsed_click_ids = JSON.parse(decodeURIComponent(window.metrion.helpers.get_cookie_value(window.metrion_api.click_ids_cookie_name))); 130 if(parsed_click_ids !== null && typeof parsed_click_ids.gclid !== "undefined"){ 131 google_ads_click_id = parsed_click_ids.gclid; 132 } 133 }catch(e){}; 134 135 for (let sync of window.metrion_api.metrion_google_ads_syncs) { 136 if (!sync.domains.some(domain => window.location.href.includes(window.metrion.helpers.clean_url(domain)))) continue; 137 138 // Process purchase events 139 if(event_name === "purchase"){ 140 var order_value = parseFloat(event_data.event_body.order_total); 141 if (window.metrion_api.metrion_vat_included !== "1") { 142 order_value = order_value - parseFloat(event_data.event_body.order_total_tax); 143 } 144 if (window.metrion_api.metrion_shipping_costs_included !== "1") { 145 order_value = order_value - parseFloat(event_data.event_body.order_total_shipping); 146 } 147 // Send conversion event to Google Ads 159 148 window.gtag('event', 'conversion', { 160 'send_to': (window.metrion_api.google_ads_tag_id + "/" + window.metrion_api.google_ads_purchase_enhanced_conversion_label),161 'value': event_data.event_body.order_total,149 'send_to': `${sync.tagId}/${sync.tagLabel}`, 150 'value': `${order_value}`, 162 151 'currency': event_data.event_body.currency, 163 152 'transaction_id': event_data.event_body.order_id 164 153 }); 165 window.metrion.google_ads.purchase_triggered = true;166 167 // GOOGLE ADS CONTEXT CHECKS168 // First Check if recent relevant click-ids are stored169 var google_ads_click_id = undefined;170 try{171 //Parse the cookie if it exists172 var parsed_click_ids = JSON.parse(decodeURIComponent(window.metrion.helpers.get_cookie_value(window.metrion_api.click_ids_cookie_name)));173 if(parsed_click_ids !== null && typeof parsed_click_ids.gclid !== "undefined"){174 google_ads_click_id = parsed_click_ids.gclid;175 }176 }catch(e){};177 154 178 155 // If block dectection is not enabled set the value to undefined to remove the variable from the conversion … … 187 164 window.metrion.helpers.log_debug("Google Ads conversion send through broker", 'log'); 188 165 window.metrion.send_event("google_ads_gtag_purchase_triggered", { 189 'send_to': (window.metrion_api.google_ads_tag_id + "/" + window.metrion_api.google_ads_purchase_enhanced_conversion_label),190 'value': event_data.event_body.order_total,166 'send_to': `${sync.tagId}/${sync.tagLabel}`, 167 'value': `${order_value}`, 191 168 'currency': event_data.event_body.currency, 192 169 'transaction_id': event_data.event_body.order_id, … … 198 175 'non_interaction': "1" 199 176 }, {}); 200 } 201 else{ 202 window.metrion.helpers.log_debug("Google Ads conversion already triggered, not activated using broker", 'log'); 203 } 204 } 205 206 // Enhanced leads 207 if(event_name === "form_submit"){ 208 window.gtag('event', 'lead', { 209 'send_to': (window.metrion_api.google_ads_tag_id + "/" + window.metrion_api.google_ads_purchase_enhanced_conversion_label), 210 'transaction_id': event_data.event_body.email 211 }); 212 213 var metrion_click_ids = {}; 214 try { 215 var metrion_click_ids = JSON.parse(decodeURIComponent(window.metrion.helpers.get_cookie_value("mtrn_cids"))); 216 } catch(e) {}; 217 218 var google_ads_click_id = ""; 219 if(metrion_click_ids !== null && typeof metrion_click_ids.gclid !== "undefined"){ 220 google_ads_click_id = metrion_click_ids.gclid; 221 } 222 223 window.metrion.send_event("google_ads_gtag_lead_triggered", { 224 'send_to': (window.metrion_api.google_ads_tag_id + "/" + window.metrion_api.google_ads_purchase_enhanced_conversion_label), 225 'transaction_id': event_data.event_body.email, 226 'gclid': google_ads_click_id, 227 'non_interaction': "1" 228 }, {}); 229 } 230 231 // DYNAMIC REMARKETING 232 // Check if dynamic remarketing is enabled if that is the case, send the remarketing tag 233 if(window.metrion_api.google_ads_enable_dynamic_remarketing === "1"){ 234 235 // Google Ads dynamic remarketing item view event 236 if(event_name === "item_view"){ 237 window.gtag('event', 'view_item',{ 238 'send_to': window.metrion_api.google_ads_tag_id, 239 'value': event_data.event_body.items[0].price, 240 'currency': event_data.event_body.items[0].currency, 241 'items': [{ 242 'id': event_data.event_body.items[0].id, 243 'google_business_vertical': 'retail' 244 }] 177 } 178 179 // Enhanced leads 180 if(event_name === "form_submit"){ 181 window.gtag('event', 'lead', { 182 'send_to': `${sync.tagId}/${sync.tagLabel}`, 183 'transaction_id': event_data.event_body.email 245 184 }); 246 185 247 } 248 249 // Google Ads dynamic remarketing add to cart event 250 if(event_name === "add_to_cart"){ 251 window.gtag('event', 'add_to_cart',{ 252 'send_to': window.metrion_api.google_ads_tag_id, 253 'value': event_data.event_body.items[0].price, 254 'currency': event_data.event_body.items[0].currency, 255 'items': [{ 256 'id': event_data.event_body.items[0].id, 257 'google_business_vertical': 'retail' 258 }] 259 }); 260 261 } 262 263 // Google Ads dynamic remarketing view item list event 264 if(event_name === "view_item_list"){ 265 var google_ads_items = []; 266 var collective_value = 0; 267 var collective_currency = "EUR"; 268 269 // Loop through all items to get the collective parameters necessary for Google Ads dynamic remarketing 270 if(typeof event_data.event_body.items !== "undefined" && event_data.event_body.items.length > 0){ 271 collective_currency = event_data.event_body.items[0].currency; 186 window.metrion.send_event("google_ads_gtag_lead_triggered", { 187 'send_to': `${sync.tagId}/${sync.tagLabel}`, 188 'transaction_id': event_data.event_body.email, 189 'gclid': google_ads_click_id, 190 'non_interaction': "1" 191 }, {}); 192 } 193 194 // DYNAMIC REMARKETING 195 // Check if dynamic remarketing is enabled if that is the case, send the remarketing tag 196 if(window.metrion_api.metrion_google_ads_syncs.some(s => s.dynamicRemarketing)) { 197 198 // Google Ads dynamic remarketing item view event 199 if(event_name === "item_view"){ 200 window.gtag('event', 'view_item',{ 201 'send_to': sync.tagId, 202 'value': event_data.event_body.items[0].price, 203 'currency': event_data.event_body.items[0].currency, 204 'items': [{ 205 'id': event_data.event_body.items[0].id, 206 'google_business_vertical': 'retail' 207 }] 208 }); 209 210 } 211 212 // Google Ads dynamic remarketing add to cart event 213 if(event_name === "add_to_cart"){ 214 window.gtag('event', 'add_to_cart',{ 215 'send_to': sync.tagId, 216 'value': event_data.event_body.items[0].price, 217 'currency': event_data.event_body.items[0].currency, 218 'items': [{ 219 'id': event_data.event_body.items[0].id, 220 'google_business_vertical': 'retail' 221 }] 222 }); 223 224 } 225 226 // Google Ads dynamic remarketing view item list event 227 if(event_name === "view_item_list"){ 228 var google_ads_items = []; 229 var collective_value = 0; 230 var collective_currency = "EUR"; 231 232 // Loop through all items to get the collective parameters necessary for Google Ads dynamic remarketing 233 if(typeof event_data.event_body.items !== "undefined" && event_data.event_body.items.length > 0){ 234 collective_currency = event_data.event_body.items[0].currency; 235 for(var google_ads_item_i = 0; google_ads_item_i < event_data.event_body.items.length; google_ads_item_i ++ ){ 236 google_ads_items.push({ 237 id: event_data.event_body.items[google_ads_item_i].id, 238 'google_business_vertical': 'retail' 239 }); 240 collective_value = parseFloat(collective_value) + (parseFloat(event_data.event_body.items[google_ads_item_i].price)); 241 } 242 } 243 // Send remarketing event 244 window.gtag('event', 'view_item_list',{ 245 'send_to': sync.tagId, 246 'value': collective_value, 247 'currency': collective_currency, 248 'items': google_ads_items 249 }); 250 } 251 252 // Google Ads dynamic remarketing view search results event 253 if(event_name === "view_search_results"){ 254 var google_ads_items = []; 255 var collective_value = 0; 256 var collective_currency = "EUR"; 257 258 // Loop through all items to get the collective parameters necessary for Google Ads dynamic remarketing 259 if(typeof event_data.event_body.items !== "undefined" && event_data.event_body.items.length > 0){ 260 collective_currency = event_data.event_body.items[0].currency; 261 for(var google_ads_item_i = 0; google_ads_item_i < event_data.event_body.items.length; google_ads_item_i ++ ){ 262 google_ads_items.push({ 263 id: event_data.event_body.items[google_ads_item_i].id, 264 'google_business_vertical': 'retail' 265 }); 266 collective_value = parseFloat(collective_value) + (parseFloat(event_data.event_body.items[google_ads_item_i].price) * parseInt(event_data.event_body.items[google_ads_item_i].quantity)); 267 } 268 } 269 // Send remarketing event 270 window.gtag('event', 'view_search_results',{ 271 'send_to': sync.tagId, 272 'value': collective_value, 273 'currency': collective_currency, 274 'items': google_ads_items 275 }); 276 } 277 278 // Google Ads dynamic remarketing add to cart event 279 if(event_name === "begin_checkout"){ 280 var google_ads_items = []; 281 var collective_value = 0; 282 // Loop through all items to get the collective parameters necessary for Google Ads dynamic remarketing 272 283 for(var google_ads_item_i = 0; google_ads_item_i < event_data.event_body.items.length; google_ads_item_i ++ ){ 273 284 google_ads_items.push({ 274 285 id: event_data.event_body.items[google_ads_item_i].id, 275 'google_business_vertical': 'retail'286 'google_business_vertical': 'retail' 276 287 }); 277 collective_value = parseFloat(collective_value) + (parseFloat(event_data.event_body.items[google_ads_item_i].price)); 278 } 279 } 280 // Send remarketing event 281 window.gtag('event', 'view_item_list',{ 282 'send_to': window.metrion_api.google_ads_tag_id, 283 'value': collective_value, 284 'currency': collective_currency, 285 'items': google_ads_items 286 }); 287 } 288 289 // Google Ads dynamic remarketing view search results event 290 if(event_name === "view_search_results"){ 291 var google_ads_items = []; 292 var collective_value = 0; 293 var collective_currency = "EUR"; 294 295 // Loop through all items to get the collective parameters necessary for Google Ads dynamic remarketing 296 if(typeof event_data.event_body.items !== "undefined" && event_data.event_body.items.length > 0){ 297 collective_currency = event_data.event_body.items[0].currency; 288 collective_value = parseFloat(collective_value) + (parseFloat(event_data.event_body.items[google_ads_item_i].price) * parseInt(event_data.event_body.items[google_ads_item_i].quantity)); 289 } 290 // Send remarketing event 291 window.gtag('event', 'begin_checkout',{ 292 'send_to': sync.tagId, 293 'value': collective_value, 294 'currency': event_data.event_body.items[0].currency, 295 'items': google_ads_items 296 }); 297 298 } 299 // Process purchase events 300 if(event_name === "purchase"){ 301 // Loop through all items to get the collective parameters necessary for Google Ads dynamic remarketing 302 var google_ads_items = []; 303 var collective_value = 0; 298 304 for(var google_ads_item_i = 0; google_ads_item_i < event_data.event_body.items.length; google_ads_item_i ++ ){ 299 305 google_ads_items.push({ 300 306 id: event_data.event_body.items[google_ads_item_i].id, 301 'google_business_vertical': 'retail'307 'google_business_vertical': 'retail' 302 308 }); 303 309 collective_value = parseFloat(collective_value) + (parseFloat(event_data.event_body.items[google_ads_item_i].price) * parseInt(event_data.event_body.items[google_ads_item_i].quantity)); 304 310 } 305 } 306 // Send remarketing event 307 window.gtag('event', 'view_search_results',{ 308 'send_to': window.metrion_api.google_ads_tag_id, 309 'value': collective_value, 310 'currency': collective_currency, 311 'items': google_ads_items 312 }); 313 } 314 315 // Google Ads dynamic remarketing add to cart event 316 if(event_name === "begin_checkout"){ 317 var google_ads_items = []; 318 var collective_value = 0; 319 // Loop through all items to get the collective parameters necessary for Google Ads dynamic remarketing 320 for(var google_ads_item_i = 0; google_ads_item_i < event_data.event_body.items.length; google_ads_item_i ++ ){ 321 google_ads_items.push({ 322 id: event_data.event_body.items[google_ads_item_i].id, 323 'google_business_vertical': 'retail' 324 }); 325 collective_value = parseFloat(collective_value) + (parseFloat(event_data.event_body.items[google_ads_item_i].price) * parseInt(event_data.event_body.items[google_ads_item_i].quantity)); 326 } 327 // Send remarketing event 328 window.gtag('event', 'begin_checkout',{ 329 'send_to': window.metrion_api.google_ads_tag_id, 330 'value': collective_value, 331 'currency': event_data.event_body.items[0].currency, 332 'items': google_ads_items 333 }); 334 335 } 336 // Process purchase events 337 if(event_name === "purchase"){ 338 // Loop through all items to get the collective parameters necessary for Google Ads dynamic remarketing 339 var google_ads_items = []; 340 var collective_value = 0; 341 for(var google_ads_item_i = 0; google_ads_item_i < event_data.event_body.items.length; google_ads_item_i ++ ){ 342 google_ads_items.push({ 343 id: event_data.event_body.items[google_ads_item_i].id, 344 'google_business_vertical': 'retail' 345 }); 346 collective_value = parseFloat(collective_value) + (parseFloat(event_data.event_body.items[google_ads_item_i].price) * parseInt(event_data.event_body.items[google_ads_item_i].quantity)); 347 } 348 // Send remarketing event to Google Ads 349 window.gtag('event', 'purchase', { 350 'send_to': window.metrion_api.google_ads_tag_id, 351 'value': event_data.event_body.order_total, 352 'currency': event_data.event_body.currency, 353 'transaction_id': event_data.event_body.order_id, 354 'items': google_ads_items 355 }); 356 } 357 } 311 312 var order_value = parseFloat(event_data.event_body.order_total); 313 if (window.metrion_api.metrion_vat_included !== "1") { 314 order_value = order_value - parseFloat(event_data.event_body.order_total_tax); 315 } 316 if (window.metrion_api.metrion_shipping_costs_included !== "1") { 317 order_value = order_value - parseFloat(event_data.event_body.order_total_shipping); 318 } 319 // Send remarketing event to Google Ads 320 window.gtag('event', 'purchase', { 321 'send_to': sync.tagId, 322 'value': `${order_value}`, 323 'currency': event_data.event_body.currency, 324 'transaction_id': event_data.event_body.order_id, 325 'items': google_ads_items 326 }); 327 } 328 } 329 } 358 330 } 359 331 }; -
metrion/trunk/js/meta/events.js
r3382453 r3453704 14 14 15 15 // Trigger the initial events 16 fbq('init', window.metrion_api.meta_pixel_id, { 17 "external_id": window.metrion.helpers.get_cookie_value((window.metrion_api.user_cookie_name + "_js")).split("--")[0] 18 }); 16 for(let sync of window.metrion_api.metrion_meta_ads_syncs) { 17 if (!sync.domains.some(domain => window.location.href.includes(window.metrion.helpers.clean_url(domain)))) continue; 18 19 fbq('init', sync.pixelId, { 20 "external_id": window.metrion.helpers.get_cookie_value((window.metrion_api.user_cookie_name + "_js")).split("--")[0] 21 }); 22 } 19 23 20 24 // Check broker que for the initial events 21 25 if(window.metrion.configuration.event_broker_queue.length > 0){ 22 26 for(i=0;i<window.metrion.configuration.event_broker_queue.length;i ++){ 23 // Get the specific event 24 var queued_event = window.metrion.configuration.event_broker_queue[i]; 25 if(!queued_event.triggered_to_meta){ 26 queued_event.triggered_to_meta = true; 27 window.metrion.meta.event_broker_handler(queued_event); 28 // Update the event so it is tagged with the 29 window.metrion.configuration.event_broker_queue[i] = queued_event; 30 } 27 window.metrion.meta.event_broker_handler(window.metrion.configuration.event_broker_queue[i]); 31 28 } 32 29 } … … 36 33 // Save the original push method 37 34 var originalPush = arr.push; 35 38 36 // Override the push method to trigger the callback 39 37 arr.push = function(e) { 40 // Add the "triggered_to_meta" attribute to the object41 var meta_events_of_interest = [42 "page_view",43 "item_view",44 "view_search_results",45 "add_to_cart",46 "begin_checkout",47 "purchase"48 ];49 if (typeof e === 'object' && e !== null && meta_events_of_interest.indexOf(e.event_name) !== -1) {50 e.triggered_to_meta = true;51 }52 38 // Call the original push method to maintain normal functionality 53 39 var result = originalPush.apply(arr, arguments); … … 61 47 var event_name = event_data.event_name; 62 48 var event_data = event_data.event_data; 63 //PageView 64 if(event_name === "page_view"){ 65 window.fbq('trackSingle', window.metrion_api.meta_pixel_id, "PageView", { 66 test_event_code: window.metrion_api.meta_test_event_code, 67 68 }, 69 { 70 eventID: event_data[window.metrion_api.event_id_name] 71 }); 72 } 73 74 //Search 75 if(event_name === "view_search_results"){ 76 var item_contents = []; 77 var item_content_ids = []; 78 var collective_value = 0; 79 var collective_currency = "EUR"; 80 if(typeof event_data.event_body.items != "undefined" && event_data.event_body.items.length > 0){ 81 collective_currency = event_data.event_body.items[0].currency; // Get from the first item 82 // Loop through all items to get the collective parameters necessary for Meta 83 for(var meta_item_i = 0; meta_item_i < event_data.event_body.items.length; meta_item_i ++ ){ 84 var current_item_quantity = window.metrion.helpers.safe_parse_int(event_data.event_body.items[meta_item_i].quantity); 85 var current_item_price = window.metrion.helpers.safe_parse_float(event_data.event_body.items[meta_item_i].price); 86 item_contents.push({ 87 id: event_data.event_body.items[meta_item_i].id, 88 quantity: current_item_quantity 89 }); 90 item_content_ids.push(event_data.event_body.items[meta_item_i].id); 91 item_count = parseInt(item_count) + current_item_quantity; 92 collective_value = parseFloat(collective_value) + (current_item_price * current_item_quantity); 93 } 94 } 95 96 window.fbq('trackSingle', window.metrion_api.meta_pixel_id, "Search", { 97 test_event_code: window.metrion_api.meta_test_event_code, 98 search_string: event_data.event_body.search_term, 99 content_type: "product", 100 currency: collective_currency, 101 content_ids: item_content_ids, 102 value: collective_value, 103 currency: collective_currency, 104 contents: item_contents, 105 }, 106 { 107 eventID: event_data[window.metrion_api.event_id_name] 108 }); 109 } 110 111 //AddToCart 112 if(event_name === "add_to_cart"){ 113 // Based on reference found here: https://developers.facebook.com/docs/meta-pixel/reference/ 114 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 115 window.fbq('trackSingle', window.metrion_api.meta_pixel_id, "AddToCart", { 116 test_event_code: window.metrion_api.meta_test_event_code, 117 content_name: event_data.event_body.items[0].name, 118 content_category: event_data.event_body.items[0].category_1, 119 content_ids: [event_data.event_body.items[0].id], 120 content_type: event_data.event_body.items[0].type, 121 value: window.metrion.helpers.safe_parse_float(event_data.event_body.items[0].price), 122 currency: event_data.event_body.items[0].currency, 123 contents: [{ 124 id: event_data.event_body.items[0].id, 125 quantity: window.metrion.helpers.safe_parse_int(event_data.event_body.items[0].quantity) 126 }] 127 }, 128 { 129 eventID: event_data[window.metrion_api.event_id_name] 130 }); 131 } 132 } 133 //ViewContent 134 if(event_name === "item_view"){ 135 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 136 window.fbq('trackSingle', window.metrion_api.meta_pixel_id, "ViewContent", { 137 test_event_code: window.metrion_api.meta_test_event_code, 138 content_name: event_data.event_body.items[0].name, 139 content_category: event_data.event_body.items[0].category_1, 140 content_ids: [event_data.event_body.items[0].id], 141 content_type: event_data.event_body.items[0].type, 142 value: window.metrion.helpers.safe_parse_float(event_data.event_body.items[0].price), 143 currency: event_data.event_body.items[0].currency, 144 contents: [{ 145 id: event_data.event_body.items[0].id, 146 quantity: 1 // Set to 1 147 }] 49 50 for (let sync of window.metrion_api.metrion_meta_ads_syncs) { 51 if (!sync.domains.some(domain => window.location.href.includes(window.metrion.helpers.clean_url(domain)))) continue; 52 53 //PageView 54 if(event_name === "page_view"){ 55 window.fbq('trackSingle', sync.pixelId, "PageView", { 56 test_event_code: window.metrion_api.meta_test_event_code, 148 57 }, 149 58 { 150 59 eventID: event_data[window.metrion_api.event_id_name] 151 60 }); 152 } 153 } 154 //InitiateCheckout 155 if(event_name === "begin_checkout"){ 156 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 61 } 62 63 //Search 64 if(event_name === "view_search_results"){ 157 65 var item_contents = []; 158 66 var item_content_ids = []; 159 var item_count = 0;160 67 var collective_value = 0; 161 var collective_currency = event_data.event_body.items[0].currency; // Get from the first item 162 // Loop through all items to get the collective parameters necessary for Meta 163 for(var meta_item_i = 0; meta_item_i < event_data.event_body.items.length; meta_item_i ++ ){ 164 var current_item_quantity = window.metrion.helpers.safe_parse_int(event_data.event_body.items[meta_item_i].quantity); 165 var current_item_price = window.metrion.helpers.safe_parse_float(event_data.event_body.items[meta_item_i].price); 166 item_contents.push({ 167 id: event_data.event_body.items[meta_item_i].id, 168 quantity: current_item_quantity 169 }); 170 item_content_ids.push(event_data.event_body.items[meta_item_i].id); 171 item_count = parseInt(item_count) + current_item_quantity; 172 collective_value = parseFloat(collective_value) + (current_item_price * current_item_quantity); 173 } 174 window.fbq('trackSingle', window.metrion_api.meta_pixel_id, "InitiateCheckout", { 68 var collective_currency = "EUR"; 69 if(typeof event_data.event_body.items != "undefined" && event_data.event_body.items.length > 0){ 70 collective_currency = event_data.event_body.items[0].currency; // Get from the first item 71 // Loop through all items to get the collective parameters necessary for Meta 72 for(var meta_item_i = 0; meta_item_i < event_data.event_body.items.length; meta_item_i ++ ){ 73 var current_item_quantity = window.metrion.helpers.safe_parse_int(event_data.event_body.items[meta_item_i].quantity); 74 var current_item_price = window.metrion.helpers.safe_parse_float(event_data.event_body.items[meta_item_i].price); 75 item_contents.push({ 76 id: event_data.event_body.items[meta_item_i].id, 77 quantity: current_item_quantity 78 }); 79 item_content_ids.push(event_data.event_body.items[meta_item_i].id); 80 item_count = parseInt(item_count) + current_item_quantity; 81 collective_value = parseFloat(collective_value) + (current_item_price * current_item_quantity); 82 } 83 } 84 85 window.fbq('trackSingle', sync.pixelId, "Search", { 175 86 test_event_code: window.metrion_api.meta_test_event_code, 176 num_items: item_count, 87 search_string: event_data.event_body.search_term, 88 content_type: "product", 89 currency: collective_currency, 177 90 content_ids: item_content_ids, 178 91 value: collective_value, 179 92 currency: collective_currency, 180 contents: item_contents 93 contents: item_contents, 181 94 }, 182 95 { 183 96 eventID: event_data[window.metrion_api.event_id_name] 184 97 }); 185 } 186 } 187 188 //Purchase 189 if(event_name === "purchase"){ 190 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 191 var item_contents = []; 192 var item_content_ids = []; 193 var item_count = 0; 194 var collective_value = 0; 195 var collective_currency = event_data.event_body.items[0].currency; // Get from the first item 196 197 // Loop through all items to get the collective parameters necessary for Meta 198 for(var meta_item_i = 0; meta_item_i < event_data.event_body.items.length; meta_item_i ++ ){ 199 var current_item_quantity = window.metrion.helpers.safe_parse_int(event_data.event_body.items[meta_item_i].quantity); 200 var current_item_price = window.metrion.helpers.safe_parse_float(event_data.event_body.items[meta_item_i].price); 201 item_contents.push({ 202 id: event_data.event_body.items[meta_item_i].id, 203 quantity: current_item_quantity 98 } 99 100 //AddToCart 101 if(event_name === "add_to_cart"){ 102 // Based on reference found here: https://developers.facebook.com/docs/meta-pixel/reference/ 103 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 104 window.fbq('trackSingle', sync.pixelId, "AddToCart", { 105 test_event_code: window.metrion_api.meta_test_event_code, 106 content_name: event_data.event_body.items[0].name, 107 content_category: event_data.event_body.items[0].category_1, 108 content_ids: [event_data.event_body.items[0].id], 109 content_type: event_data.event_body.items[0].type, 110 value: window.metrion.helpers.safe_parse_float(event_data.event_body.items[0].price), 111 currency: event_data.event_body.items[0].currency, 112 contents: [{ 113 id: event_data.event_body.items[0].id, 114 quantity: window.metrion.helpers.safe_parse_int(event_data.event_body.items[0].quantity) 115 }] 116 }, 117 { 118 eventID: event_data[window.metrion_api.event_id_name] 119 }); 120 } 121 } 122 //ViewContent 123 if(event_name === "item_view"){ 124 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 125 window.fbq('trackSingle', sync.pixelId, "ViewContent", { 126 test_event_code: window.metrion_api.meta_test_event_code, 127 content_name: event_data.event_body.items[0].name, 128 content_category: event_data.event_body.items[0].category_1, 129 content_ids: [event_data.event_body.items[0].id], 130 content_type: event_data.event_body.items[0].type, 131 value: window.metrion.helpers.safe_parse_float(event_data.event_body.items[0].price), 132 currency: event_data.event_body.items[0].currency, 133 contents: [{ 134 id: event_data.event_body.items[0].id, 135 quantity: 1 // Set to 1 136 }] 137 }, 138 { 139 eventID: event_data[window.metrion_api.event_id_name] 204 140 }); 205 item_content_ids.push(event_data.event_body.items[meta_item_i].id); 206 item_count = parseInt(item_count) + current_item_quantity; 207 collective_value = parseFloat(collective_value) + (current_item_price * current_item_quantity); 208 } 209 210 // Trigger the conversion 211 window.fbq('trackSingle', window.metrion_api.meta_pixel_id, "Purchase", { 212 test_event_code: window.metrion_api.meta_test_event_code, 213 num_items: item_count, 214 content_ids: item_content_ids, 215 value: collective_value, 216 currency: collective_currency, 217 contents: item_contents, 218 content_type: "product" 219 }, 220 { 221 // Use the order id instead of the event id for purchase events 222 eventID: event_data.event_body.order_id, 223 }); 141 } 142 } 143 //InitiateCheckout 144 if(event_name === "begin_checkout"){ 145 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 146 var item_contents = []; 147 var item_content_ids = []; 148 var item_count = 0; 149 var collective_value = 0; 150 var collective_currency = event_data.event_body.items[0].currency; // Get from the first item 151 // Loop through all items to get the collective parameters necessary for Meta 152 for(var meta_item_i = 0; meta_item_i < event_data.event_body.items.length; meta_item_i ++ ){ 153 var current_item_quantity = window.metrion.helpers.safe_parse_int(event_data.event_body.items[meta_item_i].quantity); 154 var current_item_price = window.metrion.helpers.safe_parse_float(event_data.event_body.items[meta_item_i].price); 155 item_contents.push({ 156 id: event_data.event_body.items[meta_item_i].id, 157 quantity: current_item_quantity 158 }); 159 item_content_ids.push(event_data.event_body.items[meta_item_i].id); 160 item_count = parseInt(item_count) + current_item_quantity; 161 collective_value = parseFloat(collective_value) + (current_item_price * current_item_quantity); 162 } 163 window.fbq('trackSingle', sync.pixelId, "InitiateCheckout", { 164 test_event_code: window.metrion_api.meta_test_event_code, 165 num_items: item_count, 166 content_ids: item_content_ids, 167 value: collective_value, 168 currency: collective_currency, 169 contents: item_contents 170 }, 171 { 172 eventID: event_data[window.metrion_api.event_id_name] 173 }); 174 } 175 } 176 177 //Purchase 178 if(event_name === "purchase"){ 179 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 180 var item_contents = []; 181 var item_content_ids = []; 182 var item_count = 0; 183 var collective_value = 0; 184 var collective_currency = event_data.event_body.items[0].currency; // Get from the first item 185 186 // Loop through all items to get the collective parameters necessary for Meta 187 for(var meta_item_i = 0; meta_item_i < event_data.event_body.items.length; meta_item_i ++ ){ 188 var current_item_quantity = window.metrion.helpers.safe_parse_int(event_data.event_body.items[meta_item_i].quantity); 189 var current_item_price = window.metrion.helpers.safe_parse_float(event_data.event_body.items[meta_item_i].price); 190 item_contents.push({ 191 id: event_data.event_body.items[meta_item_i].id, 192 quantity: current_item_quantity 193 }); 194 item_content_ids.push(event_data.event_body.items[meta_item_i].id); 195 item_count = parseInt(item_count) + current_item_quantity; 196 collective_value = parseFloat(collective_value) + (current_item_price * current_item_quantity); 197 } 198 199 // Trigger the conversion 200 window.fbq('trackSingle', sync.pixelId, "Purchase", { 201 test_event_code: window.metrion_api.meta_test_event_code, 202 num_items: item_count, 203 content_ids: item_content_ids, 204 value: collective_value, 205 currency: collective_currency, 206 contents: item_contents, 207 content_type: "product" 208 }, 209 { 210 // Use the order id instead of the event id for purchase events 211 eventID: event_data.event_body.order_id, 212 }); 213 } 224 214 } 225 215 } -
metrion/trunk/js/tiktok/events.js
r3443863 r3453704 10 10 11 11 // Trigger the initial events 12 ttq.load(window.metrion_api.tiktok_pixel_id); 12 for(let sync of window.metrion_api.metrion_tiktok_ads_syncs) { 13 if (!sync.domains.some(domain => window.location.href.includes(window.metrion.helpers.clean_url(domain)))) continue; 14 15 ttq.load(sync.pixelId); 16 } 13 17 ttq.page(); 14 18 }(window, document, 'ttq'); … … 17 21 if(window.metrion.configuration.event_broker_queue.length > 0){ 18 22 for(i=0;i<window.metrion.configuration.event_broker_queue.length;i ++){ 19 // Get the specific event 20 var queued_event = window.metrion.configuration.event_broker_queue[i]; 21 if(!queued_event.triggered_to_tiktok){ 22 queued_event.triggered_to_tiktok = true; 23 window.metrion.tiktok.event_broker_handler(queued_event); 24 // Update the event so it is tagged with the 25 window.metrion.configuration.event_broker_queue[i] = queued_event; 26 } 23 window.metrion.tiktok.event_broker_handler(window.metrion.configuration.event_broker_queue[i]); 27 24 } 28 25 } … … 34 31 // Override the push method to trigger the callback 35 32 arr.push = function(e) { 36 // Add the "triggered_to_tiktok" attribute to the object37 var tiktok_events_of_interest = [38 "item_view",39 "add_to_cart",40 "begin_checkout",41 "purchase"42 ];43 if (typeof e === 'object' && e !== null && tiktok_events_of_interest.indexOf(e.event_name) !== -1) {44 e.triggered_to_tiktok = true;45 }46 33 // Call the original push method to maintain normal functionality 47 34 var result = originalPush.apply(arr, arguments); … … 55 42 var event_name = event_data.event_name; 56 43 var event_data = event_data.event_data; 57 //PageView - no event needed58 44 59 //AddToCart 60 if(event_name === "add_to_cart"){ 61 // Based on reference found here: https://ads.tiktok.com/help/article/tiktok-pixel?lang=en 62 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 63 64 window.ttq.instance(window.metrion_api.tiktok_pixel_id).track('AddToCart', { 65 content_type: 'product', 66 content_id: event_data.event_body.items[0].id, 67 content_name: event_data.event_body.items[0].name, 68 quantity: window.metrion.helpers.safe_parse_int(event_data.event_body.items[0].quantity), 69 value: (window.metrion.helpers.safe_parse_float(event_data.event_body.items[0].price) * window.metrion.helpers.safe_parse_int(event_data.event_body.items[0].quantity)), 70 currency: event_data.event_body.items[0].currency, 71 event_id: event_data[window.metrion_api.event_id_name] 72 }); 73 } 74 } 75 //ViewContent 76 if(event_name === "item_view"){ 77 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 78 window.ttq.instance(window.metrion_api.tiktok_pixel_id).track('ViewContent', { 79 content_type: 'product', 80 content_id: event_data.event_body.items[0].id, 81 content_name: event_data.event_body.items[0].name, 82 quantity: window.metrion.helpers.safe_parse_int(event_data.event_body.items[0].quantity), 83 value: (window.metrion.helpers.safe_parse_float(event_data.event_body.items[0].price) * window.metrion.helpers.safe_parse_int(event_data.event_body.items[0].quantity)), 84 currency: event_data.event_body.items[0].currency, 85 event_id: event_data[window.metrion_api.event_id_name] 86 }); 45 46 for (let sync of window.metrion_api.metrion_tiktok_ads_syncs) { 47 if (!sync.domains.some(domain => window.location.href.includes(window.metrion.helpers.clean_url(domain)))) continue; 48 49 //AddToCart 50 if(event_name === "add_to_cart"){ 51 // Based on reference found here: https://ads.tiktok.com/help/article/tiktok-pixel?lang=en 52 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 53 54 window.ttq.instance(sync.pixelId).track('AddToCart', { 55 content_type: 'product', 56 content_id: event_data.event_body.items[0].id, 57 content_name: event_data.event_body.items[0].name, 58 quantity: window.metrion.helpers.safe_parse_int(event_data.event_body.items[0].quantity), 59 value: (window.metrion.helpers.safe_parse_float(event_data.event_body.items[0].price) * window.metrion.helpers.safe_parse_int(event_data.event_body.items[0].quantity)), 60 currency: event_data.event_body.items[0].currency, 61 event_id: event_data[window.metrion_api.event_id_name] 62 }); 63 } 64 } 65 //ViewContent 66 if(event_name === "item_view"){ 67 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 68 window.ttq.instance(sync.pixelId).track('ViewContent', { 69 content_type: 'product', 70 content_id: event_data.event_body.items[0].id, 71 content_name: event_data.event_body.items[0].name, 72 quantity: window.metrion.helpers.safe_parse_int(event_data.event_body.items[0].quantity), 73 value: (window.metrion.helpers.safe_parse_float(event_data.event_body.items[0].price) * window.metrion.helpers.safe_parse_int(event_data.event_body.items[0].quantity)), 74 currency: event_data.event_body.items[0].currency, 75 event_id: event_data[window.metrion_api.event_id_name] 76 }); 77 } 87 78 } 88 } 89 //InitiateCheckout 90 if(event_name === "begin_checkout"){ 91 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 92 var item_contents = []; 93 var item_content_ids = []; 94 var item_count = 0; 95 var collective_value = 0; 96 var collective_currency = event_data.event_body.items[0].currency; // Get from the first item 97 // Loop through all items to get the collective parameters necessary for Tiktok 98 for(var tiktok_item_i = 0; tiktok_item_i < event_data.event_body.items.length; tiktok_item_i ++ ){ 99 var current_item_quantity = window.metrion.helpers.safe_parse_int(event_data.event_body.items[tiktok_item_i].quantity); 100 var current_item_price = window.metrion.helpers.safe_parse_float(event_data.event_body.items[tiktok_item_i].price); 101 item_contents.push({ 102 content_id: event_data.event_body.items[tiktok_item_i].id, 103 quantity: current_item_quantity, 104 price: current_item_price 105 }); 106 item_content_ids.push(event_data.event_body.items[tiktok_item_i].id); 107 item_count = parseInt(item_count) + current_item_quantity; 108 collective_value = parseFloat(collective_value) + (current_item_price * current_item_quantity); 79 //InitiateCheckout 80 if(event_name === "begin_checkout"){ 81 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 82 var item_contents = []; 83 var item_content_ids = []; 84 var item_count = 0; 85 var collective_value = 0; 86 var collective_currency = event_data.event_body.items[0].currency; // Get from the first item 87 // Loop through all items to get the collective parameters necessary for Tiktok 88 for(var tiktok_item_i = 0; tiktok_item_i < event_data.event_body.items.length; tiktok_item_i ++ ){ 89 var current_item_quantity = window.metrion.helpers.safe_parse_int(event_data.event_body.items[tiktok_item_i].quantity); 90 var current_item_price = window.metrion.helpers.safe_parse_float(event_data.event_body.items[tiktok_item_i].price); 91 item_contents.push({ 92 content_id: event_data.event_body.items[tiktok_item_i].id, 93 quantity: current_item_quantity, 94 price: current_item_price 95 }); 96 item_content_ids.push(event_data.event_body.items[tiktok_item_i].id); 97 item_count = parseInt(item_count) + current_item_quantity; 98 collective_value = parseFloat(collective_value) + (current_item_price * current_item_quantity); 99 } 100 101 window.ttq.instance(sync.pixelId).track('InitiateCheckout', { 102 contents: item_contents, 103 value: collective_value, 104 content_type: 'product', 105 event_id: event_data[window.metrion_api.event_id_name], 106 currency: collective_currency 107 }); 109 108 } 109 } 110 111 //Purchase 112 if(event_name === "purchase"){ 113 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 114 var item_contents = []; 115 var item_content_ids = []; 116 var item_count = 0; 117 var collective_value = 0; 118 var collective_currency = event_data.event_body.items[0].currency; // Get from the first item 119 120 // Loop through all items to get the collective parameters necessary for Tiktok 121 for(var tiktok_item_i = 0; tiktok_item_i < event_data.event_body.items.length; tiktok_item_i ++ ){ 122 var current_item_quantity = window.metrion.helpers.safe_parse_int(event_data.event_body.items[tiktok_item_i].quantity); 123 var current_item_price = window.metrion.helpers.safe_parse_float(event_data.event_body.items[tiktok_item_i].price); 124 item_contents.push({ 125 content_id: event_data.event_body.items[tiktok_item_i].id, 126 quantity: current_item_quantity, 127 price: current_item_price 128 }); 129 item_content_ids.push(event_data.event_body.items[tiktok_item_i].id); 130 item_count = parseInt(item_count) + current_item_quantity; 131 collective_value = parseFloat(collective_value) + (current_item_price * current_item_quantity); 132 } 110 133 111 window.ttq.instance(window.metrion_api.tiktok_pixel_id).track('InitiateCheckout', { 112 contents: item_contents, 113 value: collective_value, 114 content_type: 'product', 115 event_id: event_data[window.metrion_api.event_id_name], 116 currency: collective_currency 117 }); 118 } 119 } 120 121 //Purchase 122 if(event_name === "purchase"){ 123 if(typeof event_data.event_body.items !== 'undefined' && Array.isArray(event_data.event_body.items) && event_data.event_body.items.length > 0){ 124 var item_contents = []; 125 var item_content_ids = []; 126 var item_count = 0; 127 var collective_value = 0; 128 var collective_currency = event_data.event_body.items[0].currency; // Get from the first item 129 130 // Loop through all items to get the collective parameters necessary for Tiktok 131 for(var tiktok_item_i = 0; tiktok_item_i < event_data.event_body.items.length; tiktok_item_i ++ ){ 132 var current_item_quantity = window.metrion.helpers.safe_parse_int(event_data.event_body.items[tiktok_item_i].quantity); 133 var current_item_price = window.metrion.helpers.safe_parse_float(event_data.event_body.items[tiktok_item_i].price); 134 item_contents.push({ 135 content_id: event_data.event_body.items[tiktok_item_i].id, 136 quantity: current_item_quantity, 137 price: current_item_price 138 }); 139 item_content_ids.push(event_data.event_body.items[tiktok_item_i].id); 140 item_count = parseInt(item_count) + current_item_quantity; 141 collective_value = parseFloat(collective_value) + (current_item_price * current_item_quantity); 134 window.ttq.instance(sync.pixelId).track('Purchase', { 135 contents: item_contents, 136 value: collective_value, 137 content_type: 'product', 138 event_id: event_data[window.metrion_api.event_id_name], 139 currency: collective_currency 140 }); 142 141 } 143 144 window.ttq.instance(window.metrion_api.tiktok_pixel_id).track('Purchase', {145 contents: item_contents,146 value: collective_value,147 content_type: 'product',148 event_id: event_data[window.metrion_api.event_id_name],149 currency: collective_currency150 });151 142 } 152 143 } -
metrion/trunk/main.php
r3452105 r3453704 3 3 * Plugin Name: Metrion 4 4 * Description: Skip manual implementation, sync data directly tailored to destinations like Google Ads and Meta Ads. 5 * Version: 1. 5.135 * Version: 1.6.0 6 6 * Author: Metrion 7 7 * Author URI: https://getmetrion.com … … 12 12 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly 13 13 14 define('GLOBAL_METRION_PLUGIN_VERSION', '1. 5.13');14 define('GLOBAL_METRION_PLUGIN_VERSION', '1.6.0'); 15 15 16 16 require_once plugin_dir_path(__FILE__) . 'includes/js_bundler.php'; … … 59 59 60 60 // Google Ads destination options 61 add_option('metrion_google_enable_tracking', 0); // Default setting for enabling Google tracking 62 add_option('metrion_google_ads_account_id', ''); // Default Google Ads Account ID 63 add_option('metrion_enable_google_ads_enhanced_conversions', 0); // Default setting to google enhanced conversion tracking 64 add_option('metrion_google_ads_tag_id', ''); // Open field for entering the enhanced conversion ID (only relevant if enhanced conversion tracking is enabled) 65 add_option('metrion_google_ads_purchase_enhanced_conversion_label', ''); // Open field for entering the enhanced conversion label (only relevant if enhanced conversion tracking is enabled) 61 add_option('metrion_google_ads_syncs', '[]'); 66 62 add_option('metrion_enforce_google_consent_mode', 0); // Default setting for Google consent mode 67 add_option('metrion_enable_google_ads_dynamic_remarketing', 0); // Default setting for Google dynamic remarketing68 63 69 64 // Meta Ads destination options 70 add_option('metrion_meta_enable_tracking', 0); // Default setting for enabling Meta tracking 71 add_option('metrion_meta_allow_front_end_pixel_tracking', 0); // Default setting for enabling front-end Meta tracking using the Meta pixel 72 add_option('metrion_meta_pixel_id', ''); // Open field for Meta Ads pixel ID 73 add_option('metrion_meta_capi_token', ''); // Open field for Meta Ads CAPI 65 add_option('metrion_meta_ads_syncs', '[]'); 74 66 add_option('metrion_meta_test_event_code', ''); // Open field for Meta Test event code 75 67 76 68 // TikTok Ads destination options 77 add_option('metrion_tiktok_sync_enabled', 0); // Check whether a TikTok Sync available is 78 add_option('metrion_tiktok_enable_front_end_tracking', 0); // Enable Tiktok Front-end tracking 79 add_option('metrion_tiktok_pixel_id', ''); // Open field for the TikTok Ads pixel ID 80 add_option('metrion_tiktok_test_event_code', ''); // Open field for the TikTok Ads event code 69 add_option('metrion_tiktok_ads_syncs', '[]'); 81 70 82 71 // Microsoft Ads destination options … … 132 121 // Register the Google Ads destination settings 133 122 register_setting('metrion_options_group', 'metrion_enforce_google_consent_mode', ['sanitize_callback' => 'rest_sanitize_boolean']); 134 register_setting('metrion_options_group', 'metrion_enable_google_ads_dynamic_remarketing', ['sanitize_callback' => 'rest_sanitize_boolean']);135 123 136 124 // Register the Meta Ads destination settings … … 199 187 update_option('metrion_installation_id', sanitize_text_field($body['installationId'])); 200 188 update_option('metrion_cmp_selection', sanitize_text_field($body['cmp'] ?? 'no_cmp')); 201 update_option('metrion_vat_included', sanitize_text_field($body['vat'] ?? 0));202 update_option('metrion_shipping_costs_included', sanitize_text_field($body['shippingCosts'] ?? 0));189 update_option('metrion_vat_included', $body['vat'] ?? true); 190 update_option('metrion_shipping_costs_included', $body['shippingCosts'] ?? true); 203 191 204 192 // Google Ads settings 205 $googleAdsSync = array_filter($body['syncs'] ?? [], fn($s) => $s['destination'] === 'GoogleAds'); 206 update_option('metrion_google_enable_tracking', in_array('GoogleAds', array_column($body['syncs'], 'destination'))); 207 $tagId = $googleAdsSync ? reset($googleAdsSync)['tagId'] ?? '' : ''; 208 update_option('metrion_google_ads_tag_id', sanitize_text_field($tagId)); 209 $enhanced = $googleAdsSync ? reset($googleAdsSync)['enhanced'] ?? false : false; 210 update_option('metrion_enable_google_ads_enhanced_conversions', $enhanced); 211 $tagLabel = $googleAdsSync ? reset($googleAdsSync)['tagLabel'] ?? '' : ''; 212 update_option('metrion_google_ads_purchase_enhanced_conversion_label', $tagLabel); 193 $googleAdsSyncs = array_values( 194 array_filter($body['syncs'] ?? [], fn($s) => $s['destination'] === 'GoogleAds') 195 ); 196 update_option('metrion_google_ads_syncs', json_encode($googleAdsSyncs, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR)); 213 197 214 198 // Meta Ads settings 215 $metaAdsSync = array_filter($body['syncs'] ?? [], fn($s) => $s['destination'] === 'MetaAds'); 216 update_option('metrion_meta_enable_tracking', in_array('MetaAds', array_column($body['syncs'], 'destination'))); 217 $pixelId = $metaAdsSync ? reset($metaAdsSync)['pixelId'] ?? '' : ''; 218 update_option('metrion_meta_allow_front_end_pixel_tracking', !empty($pixelId)); 219 update_option('metrion_meta_pixel_id', $pixelId); 199 $metaAdsSyncs = array_values( 200 array_filter($body['syncs'] ?? [], fn($s) => $s['destination'] === 'MetaAds') 201 ); 202 update_option('metrion_meta_ads_syncs', json_encode($metaAdsSyncs, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR)); 220 203 221 204 // TikTok Ads settings 205 $tikTokAdsSyncs = array_values( 206 array_filter($body['syncs'] ?? [], fn($s) => $s['destination'] === 'TikTokAds') 207 ); 208 update_option('metrion_tiktok_ads_syncs', json_encode($tikTokAdsSyncs, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR)); 222 209 $tikTokAdsSync = array_filter($body['syncs'] ?? [], fn($s) => $s['destination'] === 'TikTokAds'); 223 update_option('metrion_tiktok_sync_enabled', in_array('TikTokAds', array_column($body['syncs'], 'destination')));224 $pixelId = $tikTokAdsSync ? reset($tikTokAdsSync)['pixelId'] ?? '' : '';225 update_option('metrion_tiktok_enable_front_end_tracking', !empty($pixelId));226 update_option('metrion_tiktok_pixel_id', $pixelId);227 210 228 211 // Google Analytics settings -
metrion/trunk/readme.txt
r3452105 r3453704 4 4 Requires at least: 3.8 5 5 Tested up to: 6.8 6 Stable tag: 1. 5.136 Stable tag: 1.6.0 7 7 Requires PHP: 7.1 8 8 License: GPLv3 or later … … 93 93 == Changelog == 94 94 95 = 1.6.0 = 96 - Added support for multi domain & multilingual 97 - Added support for multiple destinations per channels 98 95 99 = 1.5.13 = 96 100 - Fixed a case where onetrust category mapping was not correct -
metrion/trunk/uninstall.php
r3452105 r3453704 25 25 'metrion_data_collection', 26 26 'metrion_cmp_selection', 27 'metrion_vat_included', 28 'metrion_shipping_costs_included', 27 29 'metrion_consent_cookie_name', 28 30 'metrion_consent_floodgate_name', … … 33 35 'metrion_allow_pii', 34 36 'metrion_allow_marketing', 37 'metrion_google_ads_syncs', 35 38 'metrion_google_enable_tracking', 36 39 'metrion_enable_google_ads_enhanced_conversions', … … 43 46 'metrion_session_info_storage_name', 44 47 'metrion_allow_cookie_placement_before_explicit_consent', 48 'metrion_meta_ads_syncs', 45 49 'metrion_meta_enable_tracking', 46 50 'metrion_meta_pixel_id', … … 51 55 'metrion_microsoft_ads_enable_dynamic_remarketing', 52 56 'metrion_microsoft_ads_tag_id', 57 'metrion_tiktok_ads_syncs', 53 58 'metrion_allow_pre_consent_pings', 54 59 'metrion_enable_block_detection', -
metrion/trunk/views/settings.php
r3452105 r3453704 310 310 </td> 311 311 </tr> 312 <tr valign="top">313 <th scope="row"><label for="metrion_enable_google_ads_dynamic_remarketing">Enable Google Dynamic Remarketing. Requires the Google tag ID to be filled in. Please make sure you don't have conflicting implementations remarketing (e.g. through GTM or other plugins)</label></th>314 <td>315 <label class="switch">316 <input type="checkbox" id="metrion_enable_google_ads_dynamic_remarketing" name="metrion_enable_google_ads_dynamic_remarketing" value="1" <?php checked(1, get_option('metrion_enable_google_ads_dynamic_remarketing', 0)); ?>>317 <span class="slider round"></span>318 </label>319 </td>320 </tr>321 312 </table> 322 313 </div>
Note: See TracChangeset
for help on using the changeset viewer.