Files
2026-04-28 15:13:50 +02:00

586 lines
26 KiB
PHP

<?php
/**
* The public-facing functionality of the plugin.
*
* @link https://www.thedotstore.com
* @since 3.0
*
* @package Advance_Ecommerce_Tracking
* @subpackage Advance_Ecommerce_Tracking/public
*/
/**
* The public-facing functionality of the plugin.
*
* Defines the plugin name, version, and two examples hooks for how to
* enqueue the public-facing stylesheet and JavaScript.
*
* @package Advance_Ecommerce_Tracking
* @subpackage Advance_Ecommerce_Tracking/public
* @author Thedotstore <wordpress@multidots.in>
*/
class Advance_Ecommerce_Tracking_Public {
/**
* Admin object reference.
*
* @since 3.0
* @access private
* @var Advance_Ecommerce_Tracking_Admin $admin_obj
*/
private $admin_obj = null;
/**
* The ID of this plugin.
*
* @since 3.0
* @access private
* @var string $plugin_name The ID of this plugin.
*/
private $plugin_name;
/**
* The version of this plugin.
*
* @since 3.0
* @access private
* @var string $version The current version of this plugin.
*/
private $version;
/**
* Store analytics data.
*
* @since 3.0
* @access private
* @var string $aet_data Store analytics data.
*/
private $aet_data = array();
/**
* Store analytics 4 data.
*
* @since 3.0
* @access private
* @var string $aet_4_data Store analytics 4 data.
*/
private $aet_4_data = array();
/**
* Initialize the class and set its properties.
*
* @param string $plugin_name The name of the plugin.
* @param string $version The version of this plugin.
*
* @since 3.0
*/
public function __construct( $plugin_name, $version ) {
$this->plugin_name = $plugin_name;
$this->version = $version;
$this->admin_obj = new Advance_Ecommerce_Tracking_Admin('', '');
$this->aet_data = aet_get_all_aet_tracking_data( 'et' );
$this->aet_4_data = aet_get_aet_4_tracking_data( 'et' );
}
/**
* Add inline JavaScript using wp_add_inline_script (replacement for deprecated wc_enqueue_js).
*
* Uses our own script handles (not jQuery) because our code runs in wp_footer/body
* after jQuery is already printed in wp_head - attaching to jQuery would be too late.
*
* @since 3.0
* @param string $code The JavaScript code to add.
* @param bool $needs_jquery Whether the code requires jQuery (add jquery as dependency).
*/
private function aet_add_inline_script( $code, $needs_jquery = false ) {
$handle = ( $needs_jquery ? 'aet-ga4-inline-jquery' : 'aet-ga4-inline' );
$deps = ( $needs_jquery ? array('jquery') : array() );
if ( !wp_script_is( $handle, 'registered' ) ) {
wp_register_script(
$handle,
'',
$deps,
$this->version,
true
);
}
// Always enqueue: wp_add_inline_script only prints when the script is in the queue.
// Skipping enqueue when handle was already registered could leave it out of the queue.
wp_enqueue_script( $handle );
wp_add_inline_script( $handle, $code );
}
/**
* Register the stylesheets for the public-facing side of the site.
*
* @since 3.0
*/
public function enqueue_styles() {
/**
* This function is provided for demonstration purposes only.
*
* An instance of this class should be passed to the run() function
* defined in Advance_Ecommerce_Tracking_Loader as all of the hooks are defined
* in that particular class.
*
* The Advance_Ecommerce_Tracking_Loader will then create the relationship
* between the defined hooks and the functions defined in this
* class.
*/
$css_file_path = plugin_dir_path( __FILE__ ) . 'css/advance-ecommerce-tracking-public.css';
if ( file_exists( $css_file_path ) && filesize( $css_file_path ) > 0 ) {
wp_enqueue_style(
$this->plugin_name,
plugin_dir_url( __FILE__ ) . 'css/advance-ecommerce-tracking-public.css',
array(),
$this->version,
'all'
);
}
}
/**
* Add analytics-4 tracking code here.
*
* @since 3.0
*/
public function aet_4_add_tracking_code() {
// Global site tag (gtag.js) - Google Analytics
$aet_4_data = $this->aet_4_data;
$ip_anonymization = $this->aet_data['ip_anonymization'];
$aet_et_tracking_settings = json_decode( get_option( 'aet_et_tracking_settings' ), true );
$demography = ( isset( $aet_et_tracking_settings['demogr_int_rema_adver'] ) ? $aet_et_tracking_settings['demogr_int_rema_adver'] : '' );
$mepfour = ( isset( $aet_et_tracking_settings['manually_et_px_ver_4'] ) ? $aet_et_tracking_settings['manually_et_px_ver_4'] : '' );
$config_params = array();
$demography_status = '';
if ( isset( $demography ) && "off" === $demography ) {
$demography_status = "gtag('set', 'allow_ad_personalization_signals', false );";
}
if ( "on" === $ip_anonymization ) {
$config_params['anonymize_ip'] = true;
}
// User ID tracking for GA4 - uses aet_track_user_property__premium_only when enabled
$user_id_tracking = ( isset( $this->aet_data['user_id_tracking'] ) ? $this->aet_data['user_id_tracking'] : '' );
if ( 'on' === $user_id_tracking && aet_fs()->is__premium_only() && aet_fs()->can_use_premium_code() ) {
$aet_user_args = $this->aet_track_user_property__premium_only();
if ( is_user_logged_in() && !empty( $aet_user_args['user_id']['uid'] ) ) {
$config_params['user_id'] = (string) $aet_user_args['user_id']['uid'];
} else {
$config_params['user_id'] = null;
}
}
$anonym = ( !empty( $config_params ) ? ', ' . wp_json_encode( $config_params ) : '' );
$google_analytics_opt_out = $this->aet_data['google_analytics_opt_out'];
if ( 'on' === $google_analytics_opt_out ) {
$google_analytics_opt_code = "let ga4DisableID = 'ga-disable-" . $mepfour . "';\n\t\t\t\tif (document.cookie.indexOf(ga4DisableID + '=true') > -1) {\n\t\t\t\t\twindow[ga4DisableID] = true;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction ga4Optout () {\n\t\t\t\t\tvar expDate = new Date;\n\t\t\t\t\texpDate.setMonth(expDate.getMonth() + 26);\n\t\t\t\t\tdocument.cookie = ga4DisableID + '=true; expires='+expDate.toGMTString() + ';path =/';\n\t\t\t\t\twindow[ga4DisableID] = true;\n\t\t\t\t}";
}
?>
<script async src="https://www.googletagmanager.com/gtag/js?id=<?php
echo esc_attr( $aet_4_data );
?>"></script> <?php
// phpcs:ignore
?>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '<?php
echo esc_html__( $aet_4_data, 'advance-ecommerce-tracking' );
?>' <?php
echo $anonym;
// phpcs:ignore
?>);
<?php
echo ( isset( $google_analytics_opt_code ) && !empty( $google_analytics_opt_code ) ? $google_analytics_opt_code : '' );
// phpcs:ignore
echo ( isset( $demography_status ) && !empty( $demography_status ) ? $demography_status : '' );
// phpcs:ignore
?>
</script>
<?php
}
/**
* Add js code for tracking in one variable for GA4
*
* @since 3.0
*/
public function aet_et_4_tracking_imp_js_code_in_footer() {
$track_user = aet_tracking_user( 'et' );
if ( $track_user && aet_fs()->is__premium_only() && aet_fs()->can_use_premium_code() ) {
$custom_event = $this->aet_data['custom_event'];
if ( 'on' === $custom_event ) {
echo wp_kses_post( $this->aet_ga_display_custom_event_tracking__premium_only() ?? '' );
}
}
$track_404 = $this->aet_data['track_404'];
if ( 'on' === $track_404 ) {
if ( is_404() ) {
$event_code = 'gtag("event", "404 Error", {
event_category:"404 Not Found",
event_label:"404 Not Found",
});';
$this->aet_add_inline_script( $event_code );
}
}
// Site search tracking for GA4
$search_tracking = ( isset( $this->aet_data['search_tracking'] ) ? $this->aet_data['search_tracking'] : '' );
if ( 'on' === $search_tracking && is_search() ) {
$search_term = get_search_query();
if ( !empty( $search_term ) ) {
$event_code = 'gtag("event", "view_search_results", { search_term: "' . esc_js( $search_term ) . '" });';
$this->aet_add_inline_script( $event_code );
}
}
// Sign in event: fire on next page load after login when sign_in_tracking is on.
$sign_in_tracking = ( isset( $this->aet_data['sign_in_tracking'] ) ? $this->aet_data['sign_in_tracking'] : '' );
if ( 'on' === $sign_in_tracking && get_transient( 'aet_ga4_track_sign_in' ) ) {
delete_transient( 'aet_ga4_track_sign_in' );
$event_code = 'gtag("event", "sign_in", { event_category: "Enhanced-Ecommerce", event_label: "sign_in" });';
$this->aet_add_inline_script( $event_code );
}
// Sign out event: fire on next page load after logout when sign_out_tracking is on.
$sign_out_tracking = ( isset( $this->aet_data['sign_out_tracking'] ) ? $this->aet_data['sign_out_tracking'] : '' );
if ( 'on' === $sign_out_tracking && get_transient( 'aet_ga4_track_sign_out' ) ) {
delete_transient( 'aet_ga4_track_sign_out' );
$event_code = 'gtag("event", "sign_out", { event_category: "Enhanced-Ecommerce", event_label: "sign_out" });';
$this->aet_add_inline_script( $event_code );
}
// Sign up event: fire on next page load after registration when sign_up_tracking is on.
$sign_up_tracking = ( isset( $this->aet_data['sign_up_tracking'] ) ? $this->aet_data['sign_up_tracking'] : '' );
if ( 'on' === $sign_up_tracking && get_transient( 'aet_ga4_track_sign_up' ) ) {
delete_transient( 'aet_ga4_track_sign_up' );
$event_code = 'gtag("event", "sign_up", { event_category: "Enhanced-Ecommerce", event_label: "sign_up" });';
$this->aet_add_inline_script( $event_code );
}
// Refund events: fire pending refunds when order was fully refunded (Enhanced Ecommerce, no separate setting).
$pending_refunds = get_option( 'aet_ga4_pending_refunds', array() );
if ( is_array( $pending_refunds ) && !empty( $pending_refunds ) ) {
foreach ( $pending_refunds as $refund ) {
$transaction_id = ( isset( $refund['transaction_id'] ) ? $refund['transaction_id'] : '' );
$value = ( isset( $refund['value'] ) ? (float) $refund['value'] : 0 );
$currency = ( isset( $refund['currency'] ) ? $refund['currency'] : get_woocommerce_currency() );
if ( !empty( $transaction_id ) ) {
$event_code = 'gtag("event", "refund", { event_category: "Enhanced-Ecommerce", event_label: "refund", transaction_id: "' . esc_js( $transaction_id ) . '", value: ' . esc_js( $value ) . ', currency: "' . esc_js( $currency ) . '" });';
$this->aet_add_inline_script( $event_code );
}
}
update_option( 'aet_ga4_pending_refunds', array() );
}
}
/**
* Enhanced E-commerce tracking for purchsed items.
*
* @access public
* @return void
*/
public function aet_ga_thankyou( $order_id ) {
global $woocommerce;
$order = wc_get_order( $order_id );
if ( !$order || !is_a( $order, 'WC_Order' ) ) {
return;
}
$aet_placed_order_success = $order->get_meta( 'aet_ga_placed_order_success', true );
if ( 'true' === $aet_placed_order_success || true === $aet_placed_order_success ) {
return;
}
// Get the order and output tracking code
$code = '';
//Get payment method
$payment_method = $order->get_payment_method();
//Get Applied Coupon Codes
$coupons_list = '';
if ( version_compare( $woocommerce->version, "3.7", ">" ) ) {
if ( $order->get_coupon_codes() ) {
$coupons_count = count( $order->get_coupon_codes() );
$i = 1;
foreach ( $order->get_coupon_codes() as $coupon ) {
$coupons_list .= $coupon;
if ( $i < $coupons_count ) {
$coupons_list .= ', ';
}
$i++;
}
}
} else {
if ( $order->get_coupon_codes() ) {
$coupons_count = count( $order->get_coupon_codes() );
$i = 1;
foreach ( $order->get_coupon_codes() as $coupon ) {
$coupons_list .= $coupon;
if ( $i < $coupons_count ) {
$coupons_list .= ', ';
}
$i++;
}
}
}
$currency = get_woocommerce_currency();
// Order items
if ( $order->get_items() ) {
$orderpage_prod = "";
foreach ( $order->get_items() as $item ) {
$_product = $item->get_product();
if ( version_compare( $woocommerce->version, "2.7", "<" ) ) {
$categories = get_the_terms( $_product->ID, "product_cat" );
} else {
$categories = get_the_terms( $_product->get_id(), "product_cat" );
}
$allcategories = "";
if ( $categories ) {
$cat_count = 2;
$loop_count = 1;
foreach ( $categories as $term ) {
if ( $loop_count === 1 ) {
$allcategories .= 'item_category: "' . $term->name . '",';
} else {
$allcategories .= 'item_category' . $cat_count . ': "' . $term->name . '",';
$cat_count++;
}
$loop_count++;
}
}
$discount = 0;
if ( !empty( $_product->get_regular_price() ) && !empty( $_product->get_sale_price() ) ) {
$discount = wc_format_decimal( (float) $_product->get_regular_price() - (float) $_product->get_sale_price(), wc_get_price_decimals() );
}
$qty = $item["qty"];
if ( empty( $qty ) ) {
$qty = '""';
} else {
$qty = esc_js( $item["qty"] );
}
$sku = ( !empty( $_product->get_sku() ) ? $_product->get_sku() : 'SKU_' . $_product->get_id() );
$item_brand = apply_filters( 'aet_item_brand', '' );
$brand_property = ( !empty( $item_brand ) ? 'item_brand: "' . esc_js( $item_brand ) . '",' : '' );
$orderpage_prod .= '{
item_id: "' . esc_js( $sku ) . '",
item_name: "' . html_entity_decode( addslashes( $_product->get_name() ) ) . '",
' . $brand_property . '
coupon: "' . esc_js( $coupons_list ) . '",
currency: "' . esc_js( $currency ) . '",
discount: ' . esc_js( $discount ) . ',
price: ' . esc_js( $order->get_item_total( $item ) ) . ',
' . $allcategories . '
quantity: ' . $qty . '
},';
}
$orderpage_prod = rtrim( $orderpage_prod, "," );
}
$tvc_sc = $order->get_shipping_total();
$code .= '
gtag("event", "purchase", {
event_category:"Enhanced-Ecommerce",
event_label:"purchase",
currency: "' . esc_js( $currency ) . '",
transaction_id: ' . esc_js( $order->get_order_number() ) . ',
value: ' . esc_js( $order->get_total() ) . ',
coupon: "' . esc_js( $coupons_list ) . '",
shipping: ' . esc_js( $tvc_sc ) . ',
tax: ' . esc_js( $order->get_total_tax() ) . ',
items: [ ' . $orderpage_prod . ' ],
});';
$order->update_meta_data( 'aet_ga_placed_order_success', 'true' );
$order->save();
$this->wc_version_compare( $code );
}
/**
* Enhanced E-commerce bind product data.
*
* @access public
* @return void
*/
public function aet_bind_product_metadata() {
global $product, $woocommerce;
if ( version_compare( $woocommerce->version, "2.7", "<" ) ) {
$category = get_the_terms( $product->Id, "product_cat" );
} else {
$category = get_the_terms( $product->get_id(), "product_cat" );
}
$allcategories = "";
if ( $category ) {
$cat_count = 2;
$loop_count = 1;
foreach ( $category as $term ) {
if ( $loop_count === 1 ) {
$allcategories .= 'item_category: "' . $term->name . '",';
} else {
$allcategories .= 'item_category' . $cat_count . ': "' . $term->name . '",';
$cat_count++;
}
$loop_count++;
}
}
//remove last comma(,) if multiple categories are there
$categories = rtrim( $allcategories, "," );
//declare all variable as a global which will used for make json
global
$homepage_json_fp,
$homepage_json_ATC_link,
$homepage_json_rp,
$prodpage_json_relProd,
$catpage_json,
$prodpage_json_ATC_link,
$catpage_json_ATC_link
;
//is home page then make all necessory json
if ( is_home() || is_front_page() ) {
if ( !is_array( $homepage_json_fp ) && !is_array( $homepage_json_rp ) && !is_array( $homepage_json_ATC_link ) ) {
$homepage_json_fp = array();
$homepage_json_rp = array();
$homepage_json_ATC_link = array();
}
// ATC link Array
if ( version_compare( $woocommerce->version, "2.7", "<" ) ) {
$homepage_json_ATC_link[$product->id] = array(
"ATC-link" => $product->id,
);
} else {
$homepage_json_ATC_link[$product->get_id()] = array(
"ATC-link" => $product->get_id(),
);
}
//check if product is featured product or not
if ( $product->is_featured() ) {
//check if product is already exists in homepage featured json
if ( version_compare( $woocommerce->version, "2.7", "<" ) ) {
if ( !array_key_exists( $product->id, $homepage_json_fp ) ) {
$homepage_json_fp[$product->id] = array(
"tvc_id" => esc_html( $product->id ),
"tvc_i" => esc_html( 'SKU_' . $product->id ),
"tvc_n" => esc_html( $product->get_title() ),
"tvc_p" => esc_html( $product->get_price() ),
"tvc_c" => $categories,
"ATC-link" => $product->add_to_cart_url(),
);
//else add product in homepage recent product json
} else {
$homepage_json_rp[$product->get_id()] = array(
"tvc_id" => esc_html( $product->get_id() ),
"tvc_i" => esc_html( 'SKU_' . $product->get_id() ),
"tvc_n" => esc_html( $product->get_title() ),
"tvc_p" => esc_html( $product->get_price() ),
"tvc_c" => $categories,
);
}
} else {
if ( !array_key_exists( $product->get_id(), $homepage_json_fp ) ) {
$homepage_json_fp[$product->get_id()] = array(
"tvc_id" => esc_html( $product->get_id() ),
"tvc_i" => esc_html( 'SKU_' . $product->get_id() ),
"tvc_n" => esc_html( $product->get_title() ),
"tvc_p" => esc_html( $product->get_price() ),
"tvc_c" => $categories,
"ATC-link" => $product->add_to_cart_url(),
);
//else add product in homepage recent product json
} else {
$homepage_json_rp[$product->get_id()] = array(
"tvc_id" => esc_html( $product->get_id() ),
"tvc_i" => esc_html( 'SKU_' . $product->get_id() ),
"tvc_n" => esc_html( $product->get_title() ),
"tvc_p" => esc_html( $product->get_price() ),
"tvc_c" => $categories,
);
}
}
} else {
//else prod add in homepage recent json
if ( version_compare( $woocommerce->version, "2.7", "<" ) ) {
$homepage_json_rp[$product->id] = array(
"tvc_id" => esc_html( $product->id ),
"tvc_i" => esc_html( 'SKU_' . $product->id ),
"tvc_n" => esc_html( $product->get_title() ),
"tvc_p" => esc_html( $product->get_price() ),
"tvc_c" => $categories,
);
} else {
$homepage_json_rp[$product->get_id()] = array(
"tvc_id" => esc_html( $product->get_id() ),
"tvc_i" => esc_html( 'SKU_' . $product->get_id() ),
"tvc_n" => esc_html( $product->get_title() ),
"tvc_p" => esc_html( $product->get_price() ),
"tvc_c" => $categories,
);
}
}
} else {
if ( is_product() ) {
if ( !is_array( $prodpage_json_relProd ) && !is_array( $prodpage_json_ATC_link ) ) {
$prodpage_json_relProd = array();
$prodpage_json_ATC_link = array();
}
// ATC link Array
if ( version_compare( $woocommerce->version, "2.7", "<" ) ) {
$prodpage_json_ATC_link[$product->id] = array(
"ATC-link" => $product->id,
);
$prodpage_json_relProd[$product->id] = array(
"tvc_id" => esc_html( $product->id ),
"tvc_i" => esc_html( 'SKU_' . $product->id ),
"tvc_n" => esc_html( $product->get_title() ),
"tvc_p" => esc_html( $product->get_price() ),
"tvc_c" => $categories,
);
} else {
$prodpage_json_ATC_link[$product->get_id()] = array(
"ATC-link" => $product->get_id(),
);
$prodpage_json_relProd[$product->get_id()] = array(
"tvc_id" => esc_html( $product->get_id() ),
"tvc_i" => esc_html( 'SKU_' . $product->get_id() ),
"tvc_n" => esc_html( $product->get_title() ),
"tvc_p" => esc_html( $product->get_price() ),
"tvc_c" => $categories,
);
}
} else {
if ( is_product_category() || is_search() || is_shop() || is_product_tag() ) {
if ( !is_array( $catpage_json ) && !is_array( $catpage_json_ATC_link ) ) {
$catpage_json = array();
$catpage_json_ATC_link = array();
}
//cat page ATC array
if ( version_compare( $woocommerce->version, "2.7", "<" ) ) {
$catpage_json_ATC_link[$product->id] = array(
"ATC-link" => $product->id,
);
$catpage_json[$product->id] = array(
"tvc_id" => esc_html( $product->id ),
"tvc_i" => esc_html( 'SKU_' . $product->id ),
"tvc_n" => esc_html( $product->get_title() ),
"tvc_p" => esc_html( $product->get_price() ),
"tvc_c" => $categories,
);
} else {
$catpage_json_ATC_link[$product->get_id()] = array(
"ATC-link" => $product->get_id(),
);
$catpage_json[$product->get_id()] = array(
"tvc_id" => esc_html( $product->get_id() ),
"tvc_i" => esc_html( 'SKU_' . $product->get_id() ),
"tvc_n" => esc_html( $product->get_title() ),
"tvc_p" => esc_html( $product->get_price() ),
"tvc_c" => $categories,
);
}
}
}
}
}
/**
* woocommerce version compare
*
* @access public
* @return void
*/
function wc_version_compare( $codeSnippet ) {
global $woocommerce;
$this->aet_add_inline_script( $codeSnippet, true );
}
}