engine_gates() ) {
return $scripts;
}
$c = $this->config();
$mode = $this->mode( $c );
if ( 'gtag' === $mode ) {
$primary = '' !== $this->ga_id( $c ) ? $this->ga_id( $c ) : $this->ads_id( $c );
if ( '' !== $primary ) {
$scripts['aieo-google-tag'] = array(
'src' => 'https://www.googletagmanager.com/gtag/js?id=' . rawurlencode( $primary ),
'trigger' => 'human',
'consent' => 'analytics',
);
}
} elseif ( 'gtm' === $mode && '' !== $this->gtm_id( $c ) ) {
$scripts['aieo-google-tag'] = array(
'inline' => $this->gtm_loader( $this->gtm_id( $c ) ),
'trigger' => 'human',
'consent' => 'analytics',
);
}
return $scripts;
}
private function consent_mode_js() {
if ( ! $this->engine_gates() || ! class_exists( 'AIEO_Consent' ) ) {
return '';
}
if ( 'yes' === (string) AIEO_Consent::settings()['enabled'] || '' !== AIEO_Consent::external_cmp_active() ) {
return '';
}
return 'window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}'
. 'gtag("consent","default",{"ad_storage":"denied","analytics_storage":"denied","ad_user_data":"denied","ad_personalization":"denied","wait_for_update":500});'
. '(function(){function u(){if(typeof window.aieoConsentFor!=="function"){return;}'
. 'var a=window.aieoConsentFor("analytics")?"granted":"denied",m=window.aieoConsentFor("marketing")?"granted":"denied";'
. 'gtag("consent","update",{"analytics_storage":a,"ad_storage":m,"ad_user_data":m,"ad_personalization":m});}'
. 'u();if(typeof window.aieoOnConsent==="function"){window.aieoOnConsent(u);}})();';
}
private function gtm_loader( $gtm ) {
return '(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({"gtm.start":new Date().getTime(),event:"gtm.js"});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!="dataLayer"?"&l="+l:"";j.async=true;j.src="https://www.googletagmanager.com/gtm.js?id="+i+dl;f.parentNode.insertBefore(j,f);})(window,document,"script","dataLayer",' . wp_json_encode( $gtm ) . ');';
}
public function rocket_exclusions( $excluded ) {
$excluded = is_array( $excluded ) ? $excluded : array();
$mode = $this->mode( $this->config() );
if ( 'off' === $mode ) {
return $excluded;
}
$excluded[] = 'aieo-google-tag';
if ( 'gtag' === $mode ) {
$excluded[] = 'googletagmanager.com/gtag/js';
}
return $excluded;
}
private function config() {
if ( class_exists( 'AIEO_DMM_Conversions' ) && method_exists( 'AIEO_DMM_Conversions', 'get_config' ) ) {
return AIEO_DMM_Conversions::get_config();
}
$o = get_option( 'aieo_dmm_conversions', array() );
return is_array( $o ) ? $o : array();
}
private function mode( $c ) {
$m = isset( $c['google_tag_mode'] ) ? $c['google_tag_mode'] : 'off';
return in_array( $m, array( 'off', 'gtag', 'gtm' ), true ) ? $m : 'off';
}
private function ga_id( $c ) { return isset( $c['ga_measurement_id'] ) ? trim( (string) $c['ga_measurement_id'] ) : ''; }
private function ads_id( $c ) { return isset( $c['ads_conversion_id'] ) ? trim( (string) $c['ads_conversion_id'] ) : ''; }
private function gtm_id( $c ) { return isset( $c['gtm_container_id'] ) ? trim( (string) $c['gtm_container_id'] ) : ''; }
private function ads_label( $c ){ return isset( $c['ads_conversion_label'] ) ? trim( (string) $c['ads_conversion_label'] ) : ''; }
private function marketing_blocked() {
if ( class_exists( 'AIEO_Session_Tracker' ) && method_exists( 'AIEO_Session_Tracker', 'is_marketing_consent_blocking' ) ) {
return AIEO_Session_Tracker::is_marketing_consent_blocking();
}
return false;
}
public function emit_tag() {
$c = $this->config();
$mode = $this->mode( $c );
if ( 'gtag' === $mode ) {
$ga = $this->ga_id( $c );
$ads = $this->ads_id( $c );
$primary = '' !== $ga ? $ga : $ads;
if ( '' === $primary ) {
return;
}
echo "\n\n";
if ( ! $this->engine_gates() ) {
echo '' . "\n";
}
$js = $this->consent_mode_js() . 'window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag("js",new Date());';
if ( '' !== $ga ) {
$js .= 'gtag("config",' . wp_json_encode( $ga ) . ');';
}
if ( '' !== $ads ) {
$js .= 'gtag("config",' . wp_json_encode( $ads ) . ',{"allow_enhanced_conversions":true});';
}
echo '' . "\n";
} elseif ( 'gtm' === $mode ) {
$gtm = $this->gtm_id( $c );
if ( '' === $gtm ) {
return;
}
if ( $this->engine_gates() ) {
$cm = $this->consent_mode_js();
if ( '' !== $cm ) {
echo '' . "\n";
}
return;
}
echo "\n\n";
echo '' . "\n";
}
}
public function emit_gtm_noscript() {
$c = $this->config();
if ( 'gtm' !== $this->mode( $c ) ) {
return;
}
$gtm = $this->gtm_id( $c );
if ( '' === $gtm ) {
return;
}
echo '' . "\n";
}
public function emit_purchase() {
$c = $this->config();
$mode = $this->mode( $c );
if ( 'off' === $mode ) {
return;
}
if ( ! function_exists( 'is_wc_endpoint_url' ) || ! is_wc_endpoint_url( 'order-received' ) ) {
return;
}
$oid = function_exists( 'get_query_var' ) ? absint( get_query_var( 'order-received' ) ) : 0;
if ( $oid <= 0 || ! function_exists( 'wc_get_order' ) ) {
return;
}
$order = wc_get_order( $oid );
if ( ! $order ) {
return;
}
$value = (float) $order->get_total();
$currency = (string) $order->get_currency();
$txn = (string) $order->get_id();
$ads_id = $this->ads_id( $c );
$label = $this->ads_label( $c );
$ud = ( ! $this->marketing_blocked() && class_exists( 'AIEO_PII_Hasher' ) )
? AIEO_PII_Hasher::google_gtag_user_data( $order )
: array();
if ( 'gtag' === $mode ) {
if ( '' === $ads_id ) {
return;
}
$send_to = $ads_id . ( '' !== $label ? '/' . $label : '' );
$js = '';
if ( ! empty( $ud ) ) {
$js .= 'gtag("set","user_data",' . wp_json_encode( $ud ) . ');';
}
$js .= 'gtag("event","conversion",{send_to:' . wp_json_encode( $send_to ) . ',value:' . wp_json_encode( $value ) . ',currency:' . wp_json_encode( $currency ) . ',transaction_id:' . wp_json_encode( $txn ) . '});';
echo "\n\n";
echo '' . "\n";
} elseif ( 'gtm' === $mode ) {
$payload = array(
'event' => 'aieo_purchase',
'value' => $value,
'currency' => $currency,
'transaction_id' => $txn,
);
if ( '' !== $ads_id ) { $payload['ads_conversion_id'] = $ads_id; }
if ( '' !== $label ) { $payload['ads_conversion_label'] = $label; }
if ( ! empty( $ud ) ) { $payload['user_data'] = $ud; }
$fb_mode = isset( $c['fb_mode'] ) ? (string) $c['fb_mode'] : 'off';
if ( in_array( $fb_mode, array( 'capi', 'both' ), true ) && class_exists( 'AIEO_CAPI_Sender' ) ) {
$payload['fb_event_id'] = AIEO_CAPI_Sender::get_or_mint_event_id( $order );
$payload['content_type'] = 'product';
$cap = AIEO_CAPI_Sender::instance()->build_purchase_payload( $order, $c );
$cd = ( isset( $cap['custom_data'] ) && is_array( $cap['custom_data'] ) ) ? $cap['custom_data'] : array();
if ( ! empty( $cd['content_ids'] ) ) { $payload['content_ids'] = $cd['content_ids']; }
if ( ! empty( $cd['contents'] ) ) { $payload['contents'] = $cd['contents']; }
if ( isset( $cd['num_items'] ) ) { $payload['num_items'] = (int) $cd['num_items']; }
$fbp = (string) $order->get_meta( '_aieo_fbp' );
$fbc = (string) $order->get_meta( '_aieo_fbc' );
if ( '' !== $fbp ) { $payload['fbp'] = $fbp; }
if ( '' !== $fbc ) { $payload['fbc'] = $fbc; }
}
if ( isset( $c['ga_send_server'] ) && 'yes' === $c['ga_send_server'] ) {
$cid = (string) $order->get_meta( '_aieo_ga_cid' );
if ( '' !== $cid ) { $payload['ga_client_id'] = $cid; }
}
echo "\n\n";
}
}
public function emit_ga4_events() {
$c = $this->config();
if ( 'gtag' !== $this->mode( $c ) || '' === $this->ga_id( $c ) ) {
return;
}
if ( 'yes' !== ( isset( $c['ga_send_browser'] ) ? $c['ga_send_browser'] : 'no' ) ) {
return;
}
if ( ! function_exists( 'WC' ) || ! function_exists( 'get_woocommerce_currency' ) ) {
return;
}
$events = array();
$cur = get_woocommerce_currency();
if ( WC()->session ) {
$atc = WC()->session->get( 'aieo_ga4_atc', array() );
if ( ! empty( $atc ) && is_array( $atc ) ) {
WC()->session->set( 'aieo_ga4_atc', array() );
$val = 0;
foreach ( $atc as $it ) { $val += (float) $it['price'] * (int) $it['quantity']; }
$events[] = array( 'name' => 'add_to_cart', 'params' => array( 'currency' => $cur, 'value' => round( $val, 2 ), 'items' => array_values( $atc ) ) );
}
}
if ( function_exists( 'is_search' ) && is_search() ) {
$q = function_exists( 'get_search_query' ) ? trim( (string) get_search_query() ) : '';
if ( '' !== $q ) {
$events[] = array( 'name' => 'search', 'params' => array( 'search_term' => $q ) );
}
}
if ( function_exists( 'is_product' ) && is_product() ) {
$it = $this->ga4_item( function_exists( 'wc_get_product' ) ? wc_get_product( get_queried_object_id() ) : null, 1 );
if ( $it ) {
$events[] = array( 'name' => 'view_item', 'params' => array( 'currency' => $cur, 'value' => $it['price'], 'items' => array( $it ) ) );
}
} elseif ( ( function_exists( 'is_shop' ) && is_shop() ) || ( function_exists( 'is_product_category' ) && is_product_category() ) || ( function_exists( 'is_product_tag' ) && is_product_tag() ) ) {
global $wp_query;
$items = array();
$i = 1;
foreach ( (array) ( isset( $wp_query->posts ) ? $wp_query->posts : array() ) as $post ) {
if ( count( $items ) >= 20 ) { break; }
$it = $this->ga4_item( function_exists( 'wc_get_product' ) ? wc_get_product( $post ) : null, 1 );
if ( $it ) { $it['index'] = $i++; $items[] = $it; }
}
if ( ! empty( $items ) ) {
$qo = get_queried_object();
$name = ( is_object( $qo ) && isset( $qo->name ) ) ? (string) $qo->name : __( 'Shop', 'ai-eshop-optimizer' );
$events[] = array( 'name' => 'view_item_list', 'params' => array( 'item_list_name' => $name, 'items' => $items ) );
}
}
if ( function_exists( 'is_checkout' ) && is_checkout()
&& ! ( function_exists( 'is_wc_endpoint_url' ) && is_wc_endpoint_url( 'order-received' ) )
&& WC()->cart && ! WC()->cart->is_empty() ) {
$items = array();
$val = 0;
foreach ( WC()->cart->get_cart() as $ci ) {
$it = $this->ga4_item( isset( $ci['data'] ) ? $ci['data'] : null, isset( $ci['quantity'] ) ? $ci['quantity'] : 1 );
if ( $it ) { $items[] = $it; $val += $it['price'] * $it['quantity']; }
}
if ( ! empty( $items ) ) {
$events[] = array( 'name' => 'begin_checkout', 'params' => array( 'currency' => $cur, 'value' => round( $val, 2 ), 'items' => $items ) );
}
}
if ( function_exists( 'is_wc_endpoint_url' ) && is_wc_endpoint_url( 'order-received' ) && function_exists( 'wc_get_order' ) ) {
$oid = function_exists( 'get_query_var' ) ? absint( get_query_var( 'order-received' ) ) : 0;
$order = $oid ? wc_get_order( $oid ) : null;
if ( $order ) {
$items = array();
foreach ( $order->get_items() as $li ) {
if ( ! is_a( $li, 'WC_Order_Item_Product' ) ) { continue; }
$qty = (int) $li->get_quantity();
$it = $this->ga4_item( $li->get_product(), $qty );
if ( $it ) {
$it['price'] = $qty > 0 ? round( (float) $li->get_total() / $qty, 2 ) : $it['price'];
$items[] = $it;
}
}
$events[] = array( 'name' => 'purchase', 'params' => array(
'transaction_id' => (string) $order->get_id(),
'currency' => $order->get_currency(),
'value' => (float) $order->get_total(),
'tax' => (float) $order->get_total_tax(),
'shipping' => (float) $order->get_shipping_total(),
'items' => $items,
) );
}
}
if ( empty( $events ) ) {
return;
}
$js = '';
foreach ( $events as $ev ) {
$js .= 'gtag("event",' . wp_json_encode( $ev['name'] ) . ',' . wp_json_encode( $ev['params'] ) . ');';
}
echo "\n\n";
echo '' . "\n";
}
public function emit_wishlist_listener() {
$c = $this->config();
if ( 'gtag' !== $this->mode( $c ) || '' === $this->ga_id( $c ) ) {
return;
}
if ( 'yes' !== ( isset( $c['ga_send_browser'] ) ? $c['ga_send_browser'] : 'no' ) ) {
return;
}
$cur = function_exists( 'get_woocommerce_currency' ) ? get_woocommerce_currency() : 'EUR';
$js = 'if(window.jQuery){jQuery(window).on("aieo_wishlist_updated",function(e,pid,isAdd,itemType){'
. 'try{if(isAdd&&pid&&(!itemType||"product"===itemType)&&typeof gtag==="function"){'
. 'gtag("event","add_to_wishlist",{currency:' . wp_json_encode( $cur ) . ',items:[{item_id:String(pid),quantity:1}]});'
. '}}catch(e){}});}';
echo "\n\n";
echo '' . "\n";
}
private function ga4_item( $product, $qty = 1 ) {
if ( ! is_a( $product, 'WC_Product' ) ) {
return null;
}
$item = array(
'item_id' => (string) $product->get_id(),
'item_name' => $product->get_name(),
'price' => function_exists( 'wc_get_price_to_display' ) ? round( (float) wc_get_price_to_display( $product ), 2 ) : round( (float) $product->get_price(), 2 ),
'quantity' => max( 1, (int) $qty ),
);
$cats = function_exists( 'wc_get_product_terms' ) ? wc_get_product_terms( $product->get_id(), 'product_cat', array( 'fields' => 'names' ) ) : array();
if ( ! empty( $cats ) ) {
$item['item_category'] = (string) $cats[0];
}
return $item;
}
public function stash_add_to_cart( $cart_item_key, $product_id, $quantity, $variation_id ) {
unset( $cart_item_key );
if ( ! function_exists( 'WC' ) || ! WC()->session ) {
return;
}
$pid = $variation_id ? (int) $variation_id : (int) $product_id;
$it = $this->ga4_item( function_exists( 'wc_get_product' ) ? wc_get_product( $pid ) : null, $quantity );
if ( ! $it ) {
return;
}
$pending = WC()->session->get( 'aieo_ga4_atc', array() );
$pending = is_array( $pending ) ? $pending : array();
$pending[] = $it;
WC()->session->set( 'aieo_ga4_atc', $pending );
}
}