Plugin Directory

Changeset 3453704


Ignore:
Timestamp:
02/04/2026 10:37:47 AM (5 weeks ago)
Author:
metriondev
Message:

Deploy version 1.6.0 from GitHub Actions

Location:
metrion
Files:
60 added
11 edited

Legend:

Unmodified
Added
Removed
  • metrion/trunk/includes/event_capture.php

    r3452105 r3453704  
    1919}
    2020
    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 debug
    28     metrion_echo_webhook_purchase($order_id, 'wp_head_force_echo');
    29 });
    30 
    3121// Add tracking function to both hooks with appropriate source information
    3222add_action('woocommerce_checkout_order_processed', function($order_id) {
     
    4131    metrion_order_cancelled_tracking($order_id, 'woocommerce_cancelled_order');
    4232}, 10, 1);
    43 
    44 /**
    45  * Returns an array that can be used to sanitize a <script> block using wp_kses().
    46  *
    47  * @return array
    48  */
    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 object
    70     $order = wc_get_order($order_id);
    71     if ( ! $order instanceof WC_Order ) {
    72         return;
    73     }
    74     // conversion details
    75     $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 script
    98             window.metrion.google_ads.echo_direct = function(){
    99                 // Conditionally start with the handling
    100                 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 CHECKS
    116                     // First Check if recent relevant click-ids are stored
    117                     var google_ads_click_id = undefined;
    118                     try{
    119                         //Parse the cookie if it exists
    120                         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 conversion
    127                     var block_detected = '0';
    128 
    129                     try{
    130                         //Parse the cookie if it exists
    131                         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 deduplication
    138                     // 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 conversions
    140                     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.js
    157                     window.dataLayer = window.dataLayer || [];
    158                     window.gtag = window.gtag || function(){ dataLayer.push(arguments); };
    159 
    160                     // Dynamically and Async loading of gtag script
    161                     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 conversion
    167                     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:ignore
    185         wp_kses(
    186             $script_tag,
    187             metrion_sanitize_script_block_rules()
    188         )
    189     );
    190 }
    191 
    19233
    19334function metrion_woocommerce_webhook_purchase($order_id, $triggered_by_hook = '') {
     
    493334        'api_path_part_2' => get_option('metrion_api_path_part_2', 'event'),
    494335        '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),
    495338       
    496339        // Consent information
     
    508351
    509352        // 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),
    515354        '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),
    517355   
    518356        // 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),
    522358
    523359        // Microsoft Ads specific config
     
    530366        'google_analytics_enable_tracking' => get_option('metrion_google_analytics_enable_tracking', 0),
    531367        '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)
    533372    ); 
    534373}
     
    557396    }
    558397
     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
    559404    // Initialize purchase data
    560405    $purchase_data = [
    561406        'order_id'    => $order->get_id(),
    562407        'order_total' => $order->get_total(),
     408        'order_total_tax' => $order->get_total_tax(),
     409        'order_total_shipping' => $order->get_shipping_total(),
    563410        'currency'    => $order->get_currency(),
    564411        'items'       => [],
  • metrion/trunk/includes/initial.php

    r3452105 r3453704  
    6868        'api_path_part_2' => get_option('metrion_api_path_part_2', 'event'),
    6969        '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),
    7072
    7173        // Consent manager settings
     
    8385
    8486        // 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),
    8688        '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),
    9289
    9390        // 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),
    9792        'meta_test_event_code' => get_option('metrion_meta_test_event_code', ''),
    9893
     
    10499        'google_analytics_enable_tracking' => get_option('metrion_google_analytics_enable_tracking', 0),
    105100        '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),
    107105    ];
    108106}
     
    616614        'onetrust_marketing_code' => get_option('metrion_onetrust_marketing_code', 'C0004'),
    617615        'onetrust_analytics_code' => get_option('metrion_onetrust_analytics_code', 'C0002'),
    618         'google_enable_tracking' => get_option('metrion_google_enable_tracking', 0),
    619616        '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),
    628619        'meta_test_event_code' => get_option('metrion_meta_test_event_code', ''),
    629620        'purchase_only_tracking' => get_option('metrion_purchase_only_tracking', 0),
     
    639630        'google_analytics_measurement_id' => get_option('metrion_google_analytics_measurement_id', ''),
    640631        '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)
    644635    ]);
    645636}
  • metrion/trunk/includes/js_bundler.php

    r3443863 r3453704  
    22
    33if ( ! 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 */
     11function 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}
    419
    520// Hook that runs early in admin (not just when the settings page is shown)
     
    116131
    117132    // 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") {
    119134        $source_files[] = $plugin_dir . 'js/google_ads/consent_mode.js';
    120135    }
     
    216231
    217232    // 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") {
    219234        $source_files[] = $plugin_dir . 'js/google_ads/consent_mode.js';
    220235    }
     
    226241
    227242    // Channel JS
    228     if (get_option('metrion_google_enable_tracking', false)) {
     243    if (count(metrion_get_ads_syncs_array('metrion_google_ads_syncs')) > 0) {
    229244        $source_files[] = $plugin_dir . 'js/google_ads/events.js';
    230245    }
     
    234249    }
    235250
    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) {
    237252        $source_files[] = $plugin_dir . 'js/meta/events.js';
    238253    }
    239254
    240     if (get_option('metrion_tiktok_enable_front_end_tracking', false)) {
     255    if (count(metrion_get_ads_syncs_array('metrion_tiktok_ads_syncs')) > 0) {
    241256        $source_files[] = $plugin_dir . 'js/tiktok/events.js';
    242257    }
     
    308323    $source_files = [];
    309324
    310     if (get_option('metrion_google_enable_tracking', false)) {
     325    if (count(metrion_get_ads_syncs_array('metrion_google_ads_syncs')) > 0) {
    311326        $source_files[] = $plugin_dir . 'js/google_ads/events.js';
    312327    }
     
    316331    }
    317332
    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) {
    319334        $source_files[] = $plugin_dir . 'js/meta/events.js';
    320335    }
    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) {
    323338        $source_files[] = $plugin_dir . 'js/tiktok/events.js';
    324339    }
  • metrion/trunk/js/core/events.js

    r3452105 r3453704  
    391391      }
    392392      return String(value);
     393    },
     394
     395    clean_url: function (s) {
     396      s.replace(/\/$/, '').replace(/^https?:\/\/(www\.)?/, '')
    393397    },
    394398  },
  • metrion/trunk/js/google_ads/events.js

    r3342931 r3453704  
    2424            if(window.metrion.configuration.event_broker_queue.length > 0){
    2525                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]);
    3427                }
    3528            }
     
    4134        }
    4235
    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();
    7065        // End initialization with changing the init variable
    7166        window.metrion.google_ads.initialized = true;
     
    113108    // Override push method to detect new events
    114109    arr.push = function(e) {
    115         var google_ads_events_of_interest = [
    116             //"purchase", > Handled directly in the purchase script outside of broker
    117             "form_submit"
    118         ];
    119         // If Google Ads dynamic remarketing is enabled, add them to the events of interest
    120         // See list here: https://support.google.com/google-ads/answer/7305793?hl=en
    121         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 Ads
    132         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 
    136110        // Call the original push method to maintain normal functionality
    137111        var result = originalPush.apply(arr, arguments);
     
    151125    if(window.metrion_api && window.metrion && typeof window.gtag != "undefined"){
    152126
    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
    159148                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}`,
    162151                    'currency': event_data.event_body.currency,
    163152                    'transaction_id': event_data.event_body.order_id
    164153                });
    165                 window.metrion.google_ads.purchase_triggered = true;
    166 
    167                 // GOOGLE ADS CONTEXT CHECKS
    168                 // First Check if recent relevant click-ids are stored
    169                 var google_ads_click_id = undefined;
    170                 try{
    171                     //Parse the cookie if it exists
    172                     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){};
    177154               
    178155                // If block dectection is not enabled set the value to undefined to remove the variable from the conversion
     
    187164                window.metrion.helpers.log_debug("Google Ads conversion send through broker", 'log');
    188165                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}`,
    191168                    'currency': event_data.event_body.currency,
    192169                    'transaction_id': event_data.event_body.order_id,
     
    198175                    'non_interaction': "1"
    199176                }, {});
    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
    245184                });
    246185
    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
    272283                    for(var google_ads_item_i = 0; google_ads_item_i < event_data.event_body.items.length; google_ads_item_i ++ ){
    273284                        google_ads_items.push({
    274285                            id: event_data.event_body.items[google_ads_item_i].id,
    275                             'google_business_vertical': 'retail'
     286                                'google_business_vertical': 'retail'
    276287                        });
    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;
    298304                    for(var google_ads_item_i = 0; google_ads_item_i < event_data.event_body.items.length; google_ads_item_i ++ ){
    299305                        google_ads_items.push({
    300306                            id: event_data.event_body.items[google_ads_item_i].id,
    301                             'google_business_vertical': 'retail'
     307                                'google_business_vertical': 'retail'
    302308                        });
    303309                        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));
    304310                    }
    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        }
    358330    }
    359331};
  • metrion/trunk/js/meta/events.js

    r3382453 r3453704  
    1414
    1515            // 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            }
    1923
    2024            // Check broker que for the initial events
    2125            if(window.metrion.configuration.event_broker_queue.length > 0){
    2226                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]);
    3128                }
    3229            }
     
    3633        // Save the original push method
    3734        var originalPush = arr.push;
     35       
    3836        // Override the push method to trigger the callback
    3937        arr.push = function(e) {
    40             // Add the "triggered_to_meta" attribute to the object
    41             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             }
    5238            // Call the original push method to maintain normal functionality
    5339            var result = originalPush.apply(arr, arguments);
     
    6147        var event_name = event_data.event_name;
    6248        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,       
    14857                },
    14958                {
    15059                    eventID: event_data[window.metrion_api.event_id_name]
    15160                });
    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"){
    15765                var item_contents = [];
    15866                var item_content_ids = [];
    159                 var item_count = 0;
    16067                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", {
    17586                    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,
    17790                    content_ids: item_content_ids,
    17891                    value: collective_value,
    17992                    currency: collective_currency,
    180                     contents: item_contents
     93                    contents: item_contents,         
    18194                },
    18295                {
    18396                    eventID: event_data[window.metrion_api.event_id_name]
    18497                });
    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]
    204140                    });
    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                }
    224214            }
    225215        }
  • metrion/trunk/js/tiktok/events.js

    r3443863 r3453704  
    1010
    1111            // 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            }
    1317            ttq.page();
    1418            }(window, document, 'ttq');
     
    1721            if(window.metrion.configuration.event_broker_queue.length > 0){
    1822                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]);
    2724                }
    2825            }
     
    3431        // Override the push method to trigger the callback
    3532        arr.push = function(e) {
    36             // Add the "triggered_to_tiktok" attribute to the object
    37             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             }
    4633            // Call the original push method to maintain normal functionality
    4734            var result = originalPush.apply(arr, arguments);
     
    5542        var event_name = event_data.event_name;
    5643        var event_data = event_data.event_data;
    57         //PageView - no event needed
    5844
    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                }
    8778            }
    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                    }); 
    109108                }
     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                    }
    110133
    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                    }); 
    142141                }
    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_currency
    150                 }); 
    151142            }
    152143        }
  • metrion/trunk/main.php

    r3452105 r3453704  
    33* Plugin Name:          Metrion
    44* Description:          Skip manual implementation, sync data directly tailored to destinations like Google Ads and Meta Ads.
    5 * Version:              1.5.13
     5* Version:              1.6.0
    66* Author:               Metrion
    77* Author URI:           https://getmetrion.com
     
    1212if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
    1313
    14 define('GLOBAL_METRION_PLUGIN_VERSION', '1.5.13');
     14define('GLOBAL_METRION_PLUGIN_VERSION', '1.6.0');
    1515
    1616require_once plugin_dir_path(__FILE__) . 'includes/js_bundler.php';
     
    5959
    6060    // 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', '[]');
    6662    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 remarketing
    6863
    6964    // 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', '[]');
    7466    add_option('metrion_meta_test_event_code', '');                                         // Open field for Meta Test event code
    7567
    7668    // 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', '[]');
    8170
    8271    // Microsoft Ads destination options
     
    132121    // Register the Google Ads destination settings
    133122    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']);
    135123
    136124    // Register the Meta Ads destination settings
     
    199187            update_option('metrion_installation_id', sanitize_text_field($body['installationId']));
    200188            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);
    203191
    204192            // 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));
    213197
    214198            // 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));
    220203
    221204            // 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));
    222209            $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);
    227210
    228211            // Google Analytics settings
  • metrion/trunk/readme.txt

    r3452105 r3453704  
    44Requires at least: 3.8
    55Tested up to: 6.8
    6 Stable tag: 1.5.13
     6Stable tag: 1.6.0
    77Requires PHP: 7.1
    88License: GPLv3 or later
     
    9393== Changelog ==
    9494
     95= 1.6.0 =
     96- Added support for multi domain & multilingual
     97- Added support for multiple destinations per channels
     98
    9599= 1.5.13 =
    96100- Fixed a case where onetrust category mapping was not correct
  • metrion/trunk/uninstall.php

    r3452105 r3453704  
    2525    'metrion_data_collection',
    2626    'metrion_cmp_selection',
     27    'metrion_vat_included',
     28    'metrion_shipping_costs_included',
    2729    'metrion_consent_cookie_name',
    2830    'metrion_consent_floodgate_name',
     
    3335    'metrion_allow_pii',
    3436    'metrion_allow_marketing',
     37    'metrion_google_ads_syncs',
    3538    'metrion_google_enable_tracking',
    3639    'metrion_enable_google_ads_enhanced_conversions',
     
    4346    'metrion_session_info_storage_name',
    4447    'metrion_allow_cookie_placement_before_explicit_consent',
     48    'metrion_meta_ads_syncs',
    4549    'metrion_meta_enable_tracking',
    4650    'metrion_meta_pixel_id',
     
    5155    'metrion_microsoft_ads_enable_dynamic_remarketing',
    5256    'metrion_microsoft_ads_tag_id',
     57    'metrion_tiktok_ads_syncs',
    5358    'metrion_allow_pre_consent_pings',
    5459    'metrion_enable_block_detection',
  • metrion/trunk/views/settings.php

    r3452105 r3453704  
    310310                    </td>               
    311311                </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>
    321312            </table>
    322313        </div>
Note: See TracChangeset for help on using the changeset viewer.