get_tracking_id()) {
if ($this->disable_tracking()) {
return;
}
$this->get_event_hooks();
foreach ($this->event_hooks as $key => $value) {
if (is_array($value)) {
$number_args = null;
if (is_int($value[0])) {
$number_args = $value[0];
unset($value[0]);
$value = array_values($value);
}
if ($value[0] == 'filter') {
unset($value[0]);
$value = array_values($value);
foreach ($value as $single_hook) {
if (array_key_exists($key, $this->event_settings)) {
if (isset($number_args)) {
add_filter($single_hook, array($this, $key), 10, $number_args);
} else {
add_filter($single_hook, array($this, $key));
}
}
}
} else {
foreach ($value as $single_hook) {
if (array_key_exists($key, $this->event_settings)) {
if (isset($number_args)) {
add_action($single_hook, array($this, $key), 10, $number_args);
} else {
add_action($single_hook, array($this, $key));
}
}
}
}
} else {
if (array_key_exists($key, $this->event_settings)) {
add_action($value, array($this, $key));
}
}
}
add_action('wp_head', array($this, 'get_tracking_code'), 9);
add_action('admin_head', array($this, 'get_special_tracking_code'), 9);
add_action('login_head', array($this, 'get_tracking_code'), 9);
add_action('template_redirect', array($this, 'capture_js'), 9);
add_action('woocommerce_before_shop_loop_item', array($this, 'product_impression'));
}
}
/* getting tracking id */
public function get_tracking_id()
{
if (get_option('ga4wp_auth_settings')) {
$auth_settings = get_option('ga4wp_auth_settings');
if (!empty($auth_settings['api_secret'])) {
$this->api_secret = $auth_settings['api_secret'];
} else {
$measurement_key = get_option('measurement_key');
if (!empty($measurement_key)) {
$this->api_secret = $measurement_key;
} else {
$this->api_secret = false;
}
}
if (isset($auth_settings['property_id'])) {
$property = $auth_settings['property_id'];
$pieces = explode('|', $property);
$this->tracking_id = $pieces[1];
$this->cid = $this->get_cid(true);
return $pieces[1];
} else {
if (isset($auth_settings['tracking_id'])) {
$this->tracking_id = $auth_settings['tracking_id'];
$this->cid = $this->get_cid(true);
return $auth_settings['tracking_id'];
} else {
return false;
}
}
} else {
return false;
}
}
/* adding tracking code to website */
public function get_tracking_code()
{
if ($this->disable_tracking()) {
return;
}
$tracking_id = esc_js($this->get_tracking_id());
$gtag_code_snippet = '
";
$gtag_code_snippet = apply_filters('ga4wp_gtag_code_snippet', $gtag_code_snippet, $tracking_options, $advance_options);
echo $gtag_code_snippet;
if (isset($advance_options['google_optimize']) && $advance_options['google_optimize'] && isset($advance_options['google_optimize_code']) && ($advance_options['google_optimize_code'] !== '')) {
echo '';
}
if ($advance_options) {
if (isset($advance_options['facebook_pixel']) && $advance_options['facebook_pixel'] && isset($advance_options['facebook_pixel_code']) && ($advance_options['facebook_pixel_code'] !== '')) {
?>
get_tracking_id());
$gtag_code_snippet = '
";
$gtag_code_snippet = apply_filters('ga4wp_admin_gtag_code_snippet', $gtag_code_snippet, $tracking_options, $advance_options);
echo $gtag_code_snippet;
}
public function print_js($js)
{
if ($this->disable_tracking()) {
return;
}
if (get_option('print_js')) {
delete_option('print_js');
}
return $js;
}
/* getting events and their respective hooks*/
public function get_event_hooks()
{
$settings = GA4WP_Settings::get_instance();
$this->event_hooks = $settings->ga4wp_event_hooks;
$this->event_settings = $settings->ga4wp_event_settings;
if (get_option('ga4wp_event_settings')) {
$this->event_settings = get_option('ga4wp_event_settings');
}
}
/* getting cid for event api calls */
private function get_cid($generate_cid = false)
{
$cid = '';
/* get client identity via GA cookie and only accepting value if it validated */
if (isset($_COOKIE['_ga'])) {
$ga_cookie_data = filter_var($_COOKIE['_ga'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$data = explode('.', $ga_cookie_data);
if (is_array($data) && count($data) > 3) {
if (strlen($data[2]) > 3 && strlen($data[3]) > 3) {
$cid = $data[2] . '.' . $data[3];
}
}
}
/* generate custom cid if cookie is not set */
if (empty($cid)) {
$custom_cid = $generate_cid || (empty($cid) && is_user_logged_in());
if ($custom_cid) {
$bytes = random_bytes(16);
$bytes[6] = chr(ord($bytes[6]) & 0x0f | 0x40); // set version to 0100
$bytes[8] = chr(ord($bytes[8]) & 0x3f | 0x80); // set bits 6-7 to 10
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($bytes), 4));
}
} else {
return $cid;
}
}
/* adding some js to footer of website */
public function capture_js($javascript = '')
{
if (!empty($javascript) && ($javascript !== '')) {
wc_enqueue_js($javascript);
//$this->javascript .= $javascript;
} else {
if (get_option('print_js')) {
$print_js = get_option('print_js');
if (!empty($print_js) && ($print_js !== '')) {
wc_enqueue_js($print_js);
}
}
}
if (get_option('print_js')) {
$print_js = get_option('print_js');
if (!empty($javascript) && ($javascript !== '')) {
$javascript .= $print_js;
update_option('print_js', $javascript);
}
} else {
if (!empty($javascript) && ($javascript !== '')) {
add_option('print_js', $javascript);
}
}
}
/* creating transient based on current user id or cid */
public function ga4wp_set_transient($ana_code)
{
if (is_user_logged_in()) {
$user_id = get_current_user_id();
$transient_id = 'ga4wp_analytics_code_' . $user_id;
} else {
$user_cid = $this->get_cid();
$transient_id = 'ga4wp_analytics_code_' . $user_cid;
}
$ga4wp_analytics_code = get_transient($transient_id);
if ($ga4wp_analytics_code) {
$ga4wp_analytics_code .= $ana_code;
} else {
$ga4wp_analytics_code = $ana_code;
}
set_transient($transient_id, $ga4wp_analytics_code, 300);
}
/* check for tracking should function or not */
private function disable_tracking()
{
if ($this->get_tracking_id()) {
$disable_tracking = false;
} else {
$disable_tracking = true;
}
$user_id = get_current_user_id();
if ($user_id && user_can($user_id, 'manage_woocommerce')) {
$tracking_options = get_option('ga4wp_track_settings');
if (isset($tracking_options['track_admin']) && $tracking_options['track_admin'] && is_user_logged_in() && $this->get_tracking_id()) {
$disable_tracking = false;
} else {
$settings = GA4WP_Settings::get_instance();
$track_default_settings = $settings->ga4wp_tracking_settings;
if (empty($tracking_options) && isset($track_default_settings['track_admin']) && $track_default_settings['track_admin'] && is_user_logged_in() && $this->get_tracking_id()) {
$disable_tracking = false;
} else {
$disable_tracking = true;
}
}
}
return $disable_tracking;
}
/* Avoid multi trigerring of same event */
private function avoid_multi_trigger()
{
if (!isset($_SERVER['HTTP_REFERER'])) {
if (isset($_SERVER['REQUEST_URI'])) {
update_option('ga4wp_old_url', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
}
return true;
}
if (get_option('ga4wp_old_url')) {
$ga4wp_old_url = get_option('ga4wp_old_url');
if (($ga4wp_old_url !== parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) {
update_option('ga4wp_old_url', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
return true;
} else {
return false;
}
} else {
if ((parse_url($_SERVER['HTTP_REFERER'], PHP_URL_PATH) !== parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) {
update_option('ga4wp_old_url', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
return true;
}
}
}
/* get product variation attributes */
public function get_product_variation_attributes($product)
{
if (!$product instanceof \WC_Product) {
$product = wc_get_product($product);
}
if (!$product) {
return '';
}
$variant = '';
if ('variation' === $product->get_type()) {
$variant = implode(',', array_values($product->get_variation_attributes()));
} elseif ('variable' === $product->get_type()) {
global $woocommerce;
$attributes = $product->get_default_attributes();
$variant = implode(', ', array_values($attributes));
}
return $variant;
}
/* getting user agent from server */
public function ga4wp_get_user_agent()
{
return isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
}
/* product impression */
public function product_impression()
{
$tracking_options = get_option('ga4wp_track_settings');
if (!((isset($tracking_options['product_single_track']) && is_product()) || (isset($tracking_options['product_archive_track']) && (is_shop() || is_product_taxonomy() || is_product_category() || is_product_tag() || is_cart())))) {
return;
}
global $product, $woocommerce_loop, $woocommerce;
if (!$product instanceof \WC_Product) {
return;
}
if (!empty($this->api_secret)) {
global $woocommerce_loop;
$current_total = (($woocommerce_loop['current_page'] - 1) * $woocommerce_loop['per_page']) + ($woocommerce_loop['loop']);
$item_list_name = $this->ga4wp_esc($this->get_list_name());
$item_list_id = $this->ga4wp_esc(strtolower(str_replace(' ', '_', $item_list_name)));
$item_data[] = $this->get_product_details($product->get_id());
$this->loop_items[] = array(
'item_id' => $this->ga4wp_esc($item_data[0]['item_id']),
'item_name' => $this->ga4wp_esc($item_data[0]['item_name']),
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'item_category' => $this->ga4wp_esc(isset($item_data[0]['item_category']) ? $item_data[0]['item_category'] : ''),
'item_list_id' => $this->ga4wp_esc($item_list_id),
'item_list_name' => $this->ga4wp_esc($item_list_name),
'price' => $this->ga4wp_esc($item_data[0]['price']),
'quantity' => $this->ga4wp_esc($item_data[0]['quantity']),
'index' => $this->ga4wp_esc($current_total),
);
if (isset($woocommerce_loop['per_page']) && !empty($woocommerce_loop['per_page'])) {
if ($woocommerce_loop['per_page'] < $woocommerce_loop['total']) {
if ($woocommerce_loop['loop'] == $woocommerce_loop['per_page']) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'view_item_list',
'params' => array(
'items' => $this->loop_items,
'item_list_name' => $this->ga4wp_esc($item_list_name),
'item_list_id' => $this->ga4wp_esc($item_list_id),
),
);
$this->making_remote_request();
$this->params = null;
$this->loop_items = null;
$this->data = null;
} elseif ($current_total == $woocommerce_loop['total']) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'view_item_list',
'params' => array(
'items' => $this->loop_items,
'item_list_name' => $this->ga4wp_esc($item_list_name),
'item_list_id' => $this->ga4wp_esc($item_list_id),
),
);
$this->making_remote_request();
$this->params = null;
$this->loop_items = null;
$this->data = null;
}
} else {
if ($woocommerce_loop['loop'] == $woocommerce_loop['total']) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'view_item_list',
'params' => array(
'items' => $this->loop_items,
'item_list_name' => $this->ga4wp_esc($item_list_name),
'item_list_id' => $this->ga4wp_esc($item_list_id),
),
);
$this->making_remote_request();
$this->params = null;
$this->loop_items = null;
$this->data = null;
}
}
} else {
if ($woocommerce_loop['loop'] == $woocommerce_loop['columns']) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'view_item_list',
'params' => array(
'items' => $this->loop_items,
'item_list_name' => $this->ga4wp_esc($item_list_name),
'item_list_id' => $this->ga4wp_esc($item_list_id),
),
);
$this->making_remote_request();
$this->params = null;
$this->loop_items = null;
$this->data = null;
}
}
} else {
global $product, $woocommerce, $woocommerce_loop;
$current_total = (($woocommerce_loop['current_page'] - 1) * $woocommerce_loop['per_page']) + ($woocommerce_loop['loop']);
$item_data[] = $this->get_product_details($product->get_id());
$item_list_name = $this->get_list_name();
$item_list_id = strtolower(str_replace(' ', '_', $item_list_name));
$this->loop_items .= '{
item_id: "' . $this->ga4wp_esc($item_data[0]['item_id']) . '",
item_name: "' . $this->ga4wp_esc($item_data[0]['item_name']) . '",
currency: "' . $this->ga4wp_esc(get_woocommerce_currency()) . '",
item_category: "' . $this->ga4wp_esc(isset($item_data[0]['item_category']) ? $item_data[0]['item_category'] : '') . '",
item_list_id: "' . $this->ga4wp_esc($item_list_id) . '",
item_list_name: "' . $this->ga4wp_esc($item_list_name) . '",
price: ' . $this->ga4wp_esc($item_data[0]['price']) . ',
quantity: ' . $this->ga4wp_esc($item_data[0]['quantity']) . ',
},';
if (isset($woocommerce_loop['per_page']) && !empty($woocommerce_loop['per_page'])) {
if ($woocommerce_loop['loop'] == $woocommerce_loop['per_page']) {
$ga4wp_analytics_code = 'gtag("event", "view_item_list", {
item_list_id: "' . $this->ga4wp_esc($item_list_id) . '",
item_list_name: "' . $this->ga4wp_esc($item_list_name) . '",
items: [' . $this->loop_items . ']
});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
} elseif ($current_total == $woocommerce_loop['total']) {
$ga4wp_analytics_code = 'gtag("event", "view_item_list", {
item_list_id: "' . $this->ga4wp_esc($item_list_id) . '",
item_list_name: "' . $this->ga4wp_esc($item_list_name) . '",
items: [' . $this->loop_items . ']
});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
} else {
if ($woocommerce_loop['loop'] == $woocommerce_loop['total']) {
$ga4wp_analytics_code = 'gtag("event", "view_item_list", {
item_list_id: "' . $this->ga4wp_esc($item_list_id) . '",
item_list_name: "' . $this->ga4wp_esc($item_list_name) . '",
items: [' . $this->loop_items . ']
});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
} else {
if ($woocommerce_loop['loop'] == $woocommerce_loop['columns']) {
$ga4wp_analytics_code = 'gtag("event", "view_item_list", {
item_list_id: "' . $this->ga4wp_esc($item_list_id) . '",
item_list_name: "' . $this->ga4wp_esc($item_list_name) . '",
items: [' . $this->loop_items . ']
});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
} else {
if ($woocommerce_loop['name'] == 'related') {
$related = wc_get_related_products($product->get_id());
if (is_array($related)) {
$related_count = count($related);
if (($related_count > 0) && ($woocommerce_loop['loop'] == $related_count)) {
$ga4wp_analytics_code = 'gtag("event", "view_item_list", {
item_list_id: "' . $this->ga4wp_esc($item_list_id) . '",
item_list_name: "' . $this->ga4wp_esc($item_list_name) . '",
items: [' . $this->loop_items . ']
});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
}
}
}
}
/*$ga4wp_analytics_code = 'gtag("event", "view_item_list", {
item_list_id: "' . $item_list_id . '",
item_list_name: "' . $item_list_name . '",
items: [
{
item_id: "' . $item_data[0]['item_id'] . '",
item_name: "' . $item_data[0]['item_name'] . '",
currency: "' . get_woocommerce_currency() . '",
item_category: "' . $item_data[0]['item_category'] . '",
item_list_id: "' . $item_list_id . '",
item_list_name: "' . $item_list_name . '",
price: ' . $item_data[0]['price'] . ',
quantity: ' . $item_data[0]['quantity'] . ',
}
]
});';*/
}
/* get list name */
public function get_list_name()
{
$list_name = '';
if (is_search()) {
$list_name = 'Search';
} elseif (is_shop()) {
$list_name = 'Shop';
} elseif (is_product_category()) {
$list_name = 'Product Category';
} elseif (is_product_tag()) {
$list_name = 'Product Tag';
} elseif (is_archive()) {
$list_name = 'Archive';
} elseif (is_single()) {
$list_name = 'Product Page';
} elseif (is_cart()) {
$list_name = 'cart page';
}
return $list_name;
}
/* intiating default params(check for more details) */
private function init_default_params($track_user = true)
{
$this->data['client_id'] = $this->cid;
$tracking_options = get_option('ga4wp_track_settings');
if (isset($tracking_options['not_track_user_id']) && $tracking_options['not_track_user_id']) {
/* do nothing */
} elseif ($track_user && (is_user_logged_in())) {
$this->data['user_id'] = esc_js(get_current_user_id());
}
return $this->data;
}
/* setting up request arguments for api request */
protected function get_request_args()
{
if (function_exists($this->ga4wp_get_user_agent())) {
$user_agent = $this->ga4wp_get_user_agent();
} else {
$user_agent = sprintf('%s/%s (WordPress/%s)', 'GA4WP', GA4WP_VERSION, $GLOBALS['wp_version']);
}
$advance_options = get_option('ga4wp_advance_settings');
if (isset($advance_options['google_analytics_debug_mode']) && $advance_options['google_analytics_debug_mode']) {
if (isset($this->data['events']) && is_array($this->data['events'])) {
foreach ($this->data['events'] as $group => &$data) {
if (isset($data['params']) && is_array($data['params'])) {
// Add the new element to the 'items' array
$data['params']['debug_mode'] = 1;
} else {
$data['params']['debug_mode'] = 1;
}
}
}
}
$args = array(
'method' => 'POST',
'timeout' => MINUTE_IN_SECONDS,
'redirection' => 0,
'sslverify' => true,
'user-agent' => $user_agent,
'body' => json_encode($this->data),
);
return $args;
}
/* get product details */
private function get_product_details($product_id, $quantity = 1, $i = 1)
{
global $woocommerce_loop;
$product = wc_get_product($product_id);
if ($product instanceof \WC_Product) {
$product_identifier = ($sku = $product->get_sku()) ? $sku : $product_id;
$categories = wc_get_product_terms($product_id, 'product_cat', array('orderby' => 'parent', 'order' => 'DESC'));
if (is_array($categories) || !empty($categories)) {
$product_category = '';
$j = 0;
foreach ($categories as $category) {
if (isset($category->name) && is_object($category) && ($j == 0)) {
$item['item_category'] = $this->ga4wp_esc(isset($category->name) ? $category->name : '');
} elseif (isset($category->name) && is_object($category) && ($j > 0)) {
$item['item_category' . $j] = $this->ga4wp_esc(isset($category->name) ? $category->name : '');
}
}
$j++;
}
if ($quantity < 0) {
$quantity = $quantity * (-1);
} elseif ($quantity == 0) {
$quantity = 1;
}
$item['item_id'] = $this->ga4wp_esc(strval($product_identifier));
$item['item_name'] = $this->ga4wp_esc($product->get_title());
$item['quantity'] = $this->ga4wp_esc($quantity);
$item['item_category'] = $this->ga4wp_esc($product_category);
$item['item_variant'] = $this->ga4wp_esc($this->get_product_variation_attributes($product));
$item['price'] = $this->ga4wp_esc($product->get_price());
$item['index'] = $this->ga4wp_esc(isset($woocommerce_loop['loop']) ? $woocommerce_loop['loop'] : '');
foreach ($item as $key => $value) {
if (empty($value)) {
unset($item[$key]);
}
}
return $item;
}
return '';
}
/* making remote request */
private function making_remote_request()
{
$remote_url = null;
if ((strpos((string) $this->tracking_id, 'G') !== false) && !empty($this->api_secret)) {
$remote_url = 'https://www.google-analytics.com/mp/collect?measurement_id=' . $this->tracking_id . '&api_secret=' . $this->api_secret;
}
if (!empty($remote_url)) {
$args = $this->get_request_args();
$response = null;
$i = 0;
while (1) {
$response = wp_safe_remote_request(untrailingslashit($remote_url), $args);
if (!empty($response) && is_array($response)) {
if (isset($response['response']['code']) && ((int) $response['response']['code'] < 300)) {
break;
}
}
if ($i > 1) {
break;
}
$i++;
}
}
}
/* recording signed in event -completed*/
public function user_login($user_login, $user)
{
if (!empty($this->api_secret)) {
if (class_exists('WooCommerce')) {
if (is_checkout()) {
$this->data['events'][0] = array(
'name' => 'login',
'params' => array(
'method' => 'checkout',
),
);
} else {
$this->data['events'][0] = array(
'name' => 'login',
'params' => array(
'method' => 'myaccount',
),
);
}
} else {
$this->data['events'][0] = array(
'name' => 'login',
'params' => array(
'method' => 'wplogin',
),
);
}
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
if (class_exists('WooCommerce')) {
if (is_checkout()) {
$ga4wp_analytics_code = 'gtag("event", "login", {
method: "checkout"
});';
} else {
$ga4wp_analytics_code = 'gtag("event", "login", {
method: "myaccount"
});';
}
} else {
$ga4wp_analytics_code = 'gtag("event", "login", {
method: "myaccount"
});';
}
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* recording signed out event -completed*/
public function user_logout()
{
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'logout',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "logout", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* recording viewed signup form event -completed */
public function viewed_signup_form()
{
/* if (!$this->avoid_multi_trigger()) {
return;
} */
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'viewed_signup_form',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "viewed_signup_form", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* recording user signup form event -completed*/
public function user_signup()
{
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
if (class_exists('WooCommerce')) {
if (is_checkout()) {
$this->data['events'][0] = array(
'name' => 'sign_up',
'params' => array(
'method' => 'checkout',
),
);
} else {
$this->data['events'][0] = array(
'name' => 'sign_up',
'params' => array(
'method' => 'myaccount',
),
);
}
} else {
$this->data['events'][0] = array(
'name' => 'sign_up',
'params' => array(
'method' => 'wp-signup',
),
);
}
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
if (class_exists('WooCommerce')) {
if (is_checkout()) {
$ga4wp_analytics_code = 'gtag("event", "sign_up", { method: "checkout"});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
} else {
$ga4wp_analytics_code = 'gtag("event", "sign_up", { method: "myaccount"});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
} else {
$ga4wp_analytics_code = 'gtag("event", "sign_up", { method: "myaccount"});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
}
/* recording user viewed my account page */
public function viewed_account()
{
/* if (!$this->avoid_multi_trigger()) {
return;
} */
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'viewed_account',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "viewed_account", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* recording user viewed order */
public function viewed_order($order_id)
{
/* if (!$this->avoid_multi_trigger()) {
return;
} */
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'viewed_order',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "viewed_order", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* recording user changed password event*/
public function changed_password()
{
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'changed_password',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "changed_password", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* recording event for writing review for product */
public function wrote_review($comment_ID)
{
$comment = get_comment($comment_ID);
$post_ID = $comment->comment_post_ID;
$type = get_post_type($post_ID);
if ('product' == $type) {
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'wrote_review',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "wrote_review", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
}
/* recording event for writing comment for post */
public function commented($comment_ID)
{
$comment = get_comment($comment_ID);
$post_ID = $comment->comment_post_ID;
$type = get_post_type($post_ID);
if ('post' == $type) {
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'commented',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "commented", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
}
/* recording event for viewing shop page */
public function viewed_shop()
{
if (class_exists('WooCommerce')) {
if (is_shop()) {
if (!$this->avoid_multi_trigger()) {
return;
}
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'viewed_shop',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "viewed_shop", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
}
}
/* recording event for viewing cart page -completed */
public function viewed_cart()
{
if (is_cart()) {
if (!$this->avoid_multi_trigger()) {
return;
}
$items_data = array();
foreach (WC()->cart->get_cart() as $item) {
$i = 0;
$i++;
$product_id = !empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
$items_data[] = $this->get_product_details($product_id, $item['quantity'], $i);
}
$cart_value = floatval(preg_replace('#[^\d.]#', '', WC()->cart->get_cart_contents_total()));
$params = array(
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'items' => $items_data,
'value' => $this->ga4wp_esc($cart_value),
);
foreach ($params as $key => $value) {
if (empty($value)) {
unset($params[$key]);
}
}
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'view_cart',
'params' => $params,
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$params = json_encode($params);
$ga4wp_analytics_code = 'gtag("event", "view_cart", ' . $params . ');';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
}
/* recording event for viewing product -completed*/
public function viewed_product()
{
if (!$this->avoid_multi_trigger()) {
return;
}
$product_id = get_the_ID();
$product = wc_get_product($product_id);
$items_data[] = $this->get_product_details($product_id);
$this->data = $this->init_default_params();
$item_data[] = $this->get_product_details($product_id);
if (!empty($this->api_secret)) {
$this->data['events'][0] = array(
'name' => 'view_item',
'params' => array(
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'items' => $item_data,
'value' => $this->ga4wp_esc($product->get_price()),
),
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$items_data = json_encode($items_data);
$ga4wp_analytics_code = 'gtag("event", "view_item", {
currency: "' . $this->ga4wp_esc(get_woocommerce_currency()) . '",
value:' . $this->ga4wp_esc($product->get_price()) . ',
items:' . $items_data . '
});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
$advance_options = get_option('ga4wp_advance_settings');
if (isset($advance_options['facebook_pixel']) && $advance_options['facebook_pixel'] && isset($advance_options['facebook_pixel_code']) && ($advance_options['facebook_pixel_code'] !== '')) {
if (function_exists('get_woocommerce_currency')) {
$product_currency = get_woocommerce_currency();
} else {
$product_currency = '';
}
$this->capture_js("fbq('track', 'ViewContent',{
value: " . $this->ga4wp_esc(floor($product->get_price())) . ",
currency: '" . $this->ga4wp_esc($product_currency) . "',
content_ids: " . $this->ga4wp_esc($product_id) . ",
content_type: 'product'
});");
}
}
/* recording event for product added to cart -completed*/
public function added_product($cart_item_key)
{
$item = WC()->cart->cart_contents[$cart_item_key];
$product_id = !empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
if (!$product_id) {
return;
}
$product = wc_get_product($product_id);
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$item_data[] = $this->get_product_details($product_id);
$this->data['events'][0] = array(
'name' => 'add_to_cart',
'params' => array(
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'items' => $item_data,
'value' => $this->ga4wp_esc($product->get_price()),
),
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$items_data[] = $this->get_product_details($product_id);
$items_data = json_encode($items_data);
$ga4wp_analytics_code = 'gtag("event", "add_to_cart", {
currency: "' . $this->ga4wp_esc(get_woocommerce_currency()) . '",
value:' . $this->ga4wp_esc($product->get_price()) . ',
items:' . $items_data . '
});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
$advance_options = get_option('ga4wp_advance_settings');
if (isset($advance_options['facebook_pixel']) && $advance_options['facebook_pixel'] && isset($advance_options['facebook_pixel_code']) && ($advance_options['facebook_pixel_code'] !== '')) {
if (function_exists('get_woocommerce_currency')) {
$product_currency = get_woocommerce_currency();
} else {
$product_currency = '';
}
$this->capture_js("fbq('track', 'AddToCart',{
value: " . $this->ga4wp_esc(floor($product->get_price())) . ",
currency:'" . $this->ga4wp_esc($product_currency) . "',
content_ids: " . $this->ga4wp_esc($product_id) . ",
content_type: 'product'
});");
}
}
/* recording event for product removed from cart -completed*/
public function removed_product($cart_item_key)
{
if (isset(WC()->cart->cart_contents[$cart_item_key])) {
$item = WC()->cart->cart_contents[$cart_item_key];
$product_id = !empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
if (!$product_id) {
return;
}
$product = wc_get_product($product_id);
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$item_data[] = $this->get_product_details($product_id);
$this->data['events'][0] = array(
'name' => 'remove_from_cart',
'params' => array(
'currency' => get_woocommerce_currency(),
'items' => $item_data,
'value' => $product->get_price(),
),
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$items_data[] = $this->get_product_details($product_id);
$items_data = json_encode($items_data);
$ga4wp_analytics_code = 'gtag("event", "remove_from_cart", {
currency: "' . get_woocommerce_currency() . '",
value:' . $product->get_price() . ',
items:' . $items_data . '
});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
}
/* User changing cart quantity for added product -completed*/
public function changed_quantity($cart_item_key, $quantity)
{
if (isset(WC()->cart->cart_contents[$cart_item_key])) {
$item = WC()->cart->cart_contents[$cart_item_key];
$product_id = !empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
if (!$product_id) {
return;
}
$product = wc_get_product($product_id);
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'changed_cart_quantity',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "changed_cart_quantity", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
}
/* User estimated shipping charges event -completed*/
public function estimated_shipping()
{
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'estimated_shipping',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "estimated_shipping", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* recording event for login errors */
public function user_login_errors($error_msg)
{
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'user_login_errors',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "user_login_errors", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
return $error_msg;
}
/* recording event for lost password reset */
public function lost_password($lost_password_msg)
{
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'lost_password',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "lost_password", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
return $lost_password_msg;
}
/* recording event for wrong_coupon_applied */
public function wrong_coupon_applied($error_msg, $err_code, $coupon)
{
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'wrong_coupon_applied',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "wrong_coupon_applied", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
return $error_msg;
}
/* recording event for successfully applied coupon -completed*/
public function applied_coupon($coupon_code)
{
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'applied_coupon',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "applied_coupon", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* recording event for removing applied coupon code -completed*/
public function removed_coupon($coupon_code)
{
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'removed_coupon',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "removed_coupon", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* recording event for initiating checkout -completed */
public function begin_checkout()
{
if (!$this->avoid_multi_trigger()) {
return;
}
if (!empty($this->api_secret)) {
foreach (WC()->cart->get_cart() as $item) {
$i = 0;
$i++;
$product_id = ! empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
$items_data[] = $this->get_product_details($product_id, $item['quantity'], $i);
}
$this->data = $this->init_default_params();
$checkout_value = floatval(preg_replace('#[^\d.,]#', '', WC()->cart->get_cart_total()));
$applied_coupons = WC()->cart->get_applied_coupons();
$coupon_code = '';
foreach ($applied_coupons as $coupon) {
$coupon_code .= $coupon . '/';
}
if (!empty($coupon_code)) {
$coupon_code = trim($coupon_code, '/');
}
$params = array(
'coupon' => $this->ga4wp_esc($coupon_code),
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'items' => $items_data,
'value' => $this->ga4wp_esc($checkout_value),
);
foreach ($params as $key => $value) {
if (empty($value)) {
unset($params[$key]);
}
}
$this->data['events'][0] = array(
'name' => 'begin_checkout',
'params' => $params,
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
foreach (WC()->cart->get_cart() as $item) {
$i = 0;
$i++;
$product_id = !empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
$items_data[] = $this->get_product_details($product_id, $item['quantity'], $i);
}
$checkout_value = floatval(preg_replace('#[^\d.,]#', '', WC()->cart->get_cart_contents_total()));
$applied_coupons = WC()->cart->get_applied_coupons();
$coupon_code = '';
foreach ($applied_coupons as $coupon) {
$coupon_code .= $coupon . '/';
}
if (!empty($coupon_code)) {
$coupon_code = trim($coupon_code, '/');
}
$params = array(
'coupon' => $this->ga4wp_esc($coupon_code),
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'items' => $items_data,
'value' => $this->ga4wp_esc($checkout_value),
);
foreach ($params as $key => $value) {
if (empty($value)) {
unset($params[$key]);
}
}
$params = json_encode($params);
$ga4wp_analytics_code = 'gtag("event", "begin_checkout",' . $params . ');';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* recording checkout page events starting with user provided require info */
public function filled_checkout_form()
{
$live_js = '';
$option_name = is_user_logged_in() ? 'Registered User' : 'Guest';
$live_js = "gtag( 'event','filled_checkout_form');";
$added_js = "
var user_info_fired = false;
var all_filled = true;
jQuery( 'form.checkout' ).on( 'change', 'input', function() {
if(!user_info_fired){
jQuery('input[id|=\'billing\']').each(function(){
if (!all_filled){
return;
}
if (!jQuery(this).val()){
if(jQuery(this).attr('type')=='email'){
if ( !isEmail( this.value )){
all_filled = false;
return;
}
}
if(jQuery(this).attr('type')=='phone'){
if ( !isPhone( this.value )){
all_filled = false;
return;
}
}
if(!(jQuery(this).attr('id').includes('company') || jQuery(this).attr('id').includes('address_2'))){
all_filled = false;
return;
}
}
});
if(all_filled){
user_info_fired = true;
{$live_js}
}
}
});
function isEmail(email) {
var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
return regex.test(email);
}
function isPhone(phone) {
var regex = /[0-9\-\(\)\s]+/;
return regex.test(phone);
}
jQuery( 'form.checkout' ).on( 'checkout_place_order', function() { if ( !user_info_fired ) {user_info_fired = true;{$live_js}}});";
if (!empty($added_js)) {
$this->capture_js($added_js);
}
}
/* selected shipping method */
public function added_shipping_method()
{
if (WC()->cart->get_cart_contents_count() > 0) {
foreach (WC()->cart->get_cart() as $item) {
$i = 0;
$i++;
$product_id = !empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
$items_data[] = $this->get_product_details($product_id, $item['quantity'], $i);
}
} else {
$items_data = array();
}
$applied_coupons = WC()->cart->get_applied_coupons();
$coupon_code = '';
foreach ($applied_coupons as $coupon) {
$coupon_code .= $coupon . '/';
}
if (!empty($coupon_code)) {
$coupon_code = trim($coupon_code, '/');
}
$items_data = json_encode($items_data);
$checkout_value = floatval(preg_replace('#[^\d.,]#', '', WC()->cart->get_cart_contents_total()));
if (!empty($coupon_code)) {
$live_js = "function get_shipping_event (shipping_method) {
return gtag( 'event','add_shipping_info',{
shipping_tier :shipping_method,
coupon: " . $this->ga4wp_esc($coupon_code) . ",
items:" . $items_data . ",
value: " . $this->ga4wp_esc($checkout_value) . ",
});
}";
} else {
$live_js = "function get_shipping_event (shipping_method) {
return gtag( 'event','add_shipping_info',{
shipping_tier :shipping_method,
items:" . $items_data . ",
value: " . $this->ga4wp_esc($checkout_value) . ",
});
}";
}
$js = '';
$js = $live_js;
$js .= "var selected_shipping_method = jQuery( 'input[name^=\'shipping_method\']:checked' ).val();";
$js .= "var shipping_method_tracked = false; var shipping_method = '';";
$js .= "jQuery( 'form.checkout' ).on( 'click', 'input[name^=\'shipping_method\']', function( e ) { if ( selected_shipping_method !== this.value ) { shipping_method = this.value; shipping_method_tracked = true; if(shipping_method){get_shipping_event(shipping_method);} selected_shipping_method = this.value; } });";
$js .= "jQuery( 'form.checkout' ).on( 'checkout_place_order', function() { if ( !shipping_method_tracked ) {shipping_method = selected_shipping_method ; shipping_method_tracked = true; if(shipping_method){get_shipping_event(shipping_method);} } });";
$this->capture_js($js);
}
/* selected payment method */
public function added_payment_method()
{
if (WC()->cart->get_cart_contents_count() > 0) {
foreach (WC()->cart->get_cart() as $item) {
$i = 0;
$i++;
$product_id = !empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
$items_data[] = $this->get_product_details($product_id, $item['quantity'], $i);
}
} else {
$items_data = array();
}
$applied_coupons = WC()->cart->get_applied_coupons();
$coupon_code = '';
foreach ($applied_coupons as $coupon) {
$coupon_code .= $coupon . '/';
}
if (!empty($coupon_code)) {
$coupon_code = trim($coupon_code, '/');
}
$items_data = json_encode($items_data);
$checkout_value = floatval(preg_replace('#[^\d.,]#', '', WC()->cart->get_cart_contents_total()));
if (!empty($coupon_code)) {
$live_js = "function get_paymnet_event (payment_method) {
return gtag( 'event','add_payment_info',{
payment_type :payment_method,
coupon: " . $this->ga4wp_esc($coupon_code) . ",
items:" . $items_data . ",
value: " . $this->ga4wp_esc($checkout_value) . ",
});
}";
} else {
$live_js = "function get_paymnet_event (payment_method) {
return gtag( 'event','add_payment_info',{
payment_type :payment_method,
items:" . $items_data . ",
value: " . $this->ga4wp_esc($checkout_value) . ",
});
}";
}
$js = '';
$js = $live_js;
$js .= "var selected_payment_method = jQuery( 'input[name=\'payment_method\']:checked' ).val();";
$js .= "var payment_method_tracked = false; var payment_method = '';";
$js .= "jQuery( 'form.checkout' ).on( 'click', 'input[name=\'payment_method\']', function( e ) { if ( selected_payment_method !== this.value ) { payment_method = this.value; payment_method_tracked = true; if(payment_method){get_paymnet_event(payment_method);} selected_payment_method = this.value; } });";
$js .= "jQuery( 'form.checkout' ).on( 'checkout_place_order', function() { if ( !payment_method_tracked ) {payment_method = selected_payment_method ; payment_method_tracked = true; if(payment_method){get_paymnet_event(payment_method);} } });";
$this->capture_js($js);
}
/* started payment */
public function processing_payment($order_id)
{
$order = wc_get_order($order_id);
if ($order instanceof WC_Order) {
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'processing_payment',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "processing_payment", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
}
/* order cancelled */
public function order_cancelled($order_id)
{
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'order_cancelled',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "order_cancelled", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
/* order failed */
public function order_failed($order_id, $order)
{
if ($order instanceof WC_Order) {
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'order_failed',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "order_failed", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
}
/* recording event for completed purchase */
public function completed_purchase($order_id)
{
$order = wc_get_order($order_id);
if (!$order || ('yes' === get_post_meta($order_id, 'ga4wp_already_tracked', true))) {
return;
}
if ($tracking_options = get_option('ga4wp_track_settings')) {
$order_status = $order->get_status();
if (($order_status == 'on-hold') && isset($tracking_options['disable_on_hold_conversion'])) {
return;
}
}
$coupons_list = '';
if ($order->get_coupon_codes()) {
$i = 1;
foreach ($order->get_coupon_codes() as $coupon) {
if ($i > 1) {
$coupons_list .= ',';
}
$coupons_list .= $coupon;
$i++;
}
$this->params['tcc'] = $coupons_list;
}
if (!empty($this->api_secret)) {
$i = 0;
$contents = array();
foreach ($order->get_items() as $item) {
$i++;
$product_id = ! empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
$items_data[] = $this->get_product_details($product_id, $item['qty'], $i);
$contents[] = array(
'id' => $product_id,
'quantity' => $item['qty'],
);
}
$params = array(
'coupon' => $this->ga4wp_esc($coupons_list),
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'items' => $items_data,
'transaction_id' => $this->ga4wp_esc($order->get_order_number()),
'value' => $this->ga4wp_esc($order->get_total()),
'shipping' => $this->ga4wp_esc($order->get_total_shipping()),
'tax' => $this->ga4wp_esc($order->get_total_tax()),
);
foreach ($params as $key => $value) {
if (empty($value)) {
unset($params[$key]);
}
}
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'purchase',
'params' => $params,
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$i = 0;
$contents = array();
foreach ($order->get_items() as $item) {
$i++;
$product_id = !empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
$items_data[] = $this->get_product_details($product_id, $item['qty'], $i);
$contents[] = array(
'id' => $this->ga4wp_esc($product_id),
'quantity' => $this->ga4wp_esc($item['qty']),
);
}
$params = array(
'coupon' => $this->ga4wp_esc($coupons_list),
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'items' => $items_data,
'transaction_id' => $this->ga4wp_esc($order->get_order_number()),
'value' => $this->ga4wp_esc($order->get_total()),
'shipping' => $this->ga4wp_esc($order->get_total_shipping()),
'tax' => $this->ga4wp_esc($order->get_total_tax()),
);
foreach ($params as $key => $value) {
if (empty($value)) {
unset($params[$key]);
}
}
$params = json_encode($params);
$ga4wp_analytics_code = 'gtag("event", "purchase",' . $params . ');';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
update_post_meta($order->get_id(), 'ga4wp_already_tracked', 'yes');
$this->adding_conversion_info($order_id, $contents);
}
/* adding conversion info */
public function adding_conversion_info($order_id, $contents)
{
$order = wc_get_order($order_id);
if ($order instanceof WC_Order) {
/* working for google adword conversions */
$advance_options = get_option('ga4wp_advance_settings');
if ($advance_options) {
if (isset($advance_options['google_adword']) && $advance_options['google_adword'] && isset($advance_options['google_adword_code']) && ($advance_options['google_adword_code'] !== '') && isset($advance_options['google_adword_label']) && ($advance_options['google_adword_label'] !== '')) {
$this->capture_js("gtag('event', 'conversion', {
'send_to': '" . $this->ga4wp_esc($advance_options['google_adword_code'] . "/" . $advance_options['google_adword_label']) . "',
'value': " . $this->ga4wp_esc(floor($order->get_total())) . ",
'currency': '" . $this->ga4wp_esc($order->get_currency()) . "',
'transaction_id': '" . $this->ga4wp_esc($order->get_transaction_id()) . "'
});");
}
if (isset($advance_options['facebook_pixel']) && $advance_options['facebook_pixel'] && isset($advance_options['facebook_pixel_code']) && ($advance_options['facebook_pixel_code'] !== '')) {
$this->capture_js("fbq('track', 'Purchase',{
value: " . $this->ga4wp_esc(floor($order->get_total())) . ",
currency: '" . $this->ga4wp_esc($order->get_currency()) . "',
contents: " . json_encode($contents) . ",
content_type: 'product'
});");
}
}
}
}
/* recording event for order refund */
public function order_refunded($order_id, $refund_id)
{
if ('yes' === get_post_meta($refund_id, 'ga4wp_refund_already_tracked')) {
return;
}
$order = wc_get_order($order_id);
$refund = wc_get_order($refund_id);
if (($order instanceof WC_Order) && ($refund instanceof WC_Order_Refund)) {
if (method_exists($refund, 'get_reason') && $refund->get_reason()) {
$reason = $order->get_order_number() . ' : ' . $refund->get_reason();
} else {
$reason = $order->get_order_number() . ' : Refund reason is not set';
}
$coupons_list = '';
if ($order->get_coupon_codes()) {
$i = 1;
foreach ($order->get_coupon_codes() as $coupon) {
if ($i > 1) {
$coupons_list .= ',';
}
$coupons_list .= $coupon;
$i++;
}
$this->params['tcc'] = $coupons_list;
}
if (!empty($this->api_secret)) {
$i = 0;
$refund_items_data = null;
$contents = array();
$items = $refund->get_items();
if (! empty($items)) {
foreach ($items as $item) {
$i++;
$product_id = ! empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
$refund_items_data[] = $this->get_product_details($product_id, $item['qty'], $i);
}
}
$total_refund = 0;
$refund_value = $refund->get_amount();
if (!empty($refund_items_data) && is_array($refund_items_data)) {
foreach ($refund_items_data as $refund_item) {
$total_refund = $total_refund + ($refund_item['quantity'] * $refund_item['price']);
}
}
if ($total_refund == $refund_value) {
$params = array(
'coupon' => $this->ga4wp_esc($coupons_list),
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'items' => $refund_items_data,
'transaction_id' => $this->ga4wp_esc($order->get_order_number()),
'value' => $this->ga4wp_esc($refund->get_amount()),
);
} else {
$params = array(
'coupon' => $this->ga4wp_esc($coupons_list),
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'transaction_id' => $this->ga4wp_esc($order->get_order_number()),
'value' => $this->ga4wp_esc($refund->get_amount()),
);
}
foreach ($params as $key => $value) {
if (empty($value)) {
unset($params[$key]);
}
}
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'refund',
'params' => $params,
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$i = 0;
$refund_items_data = null;
$contents = array();
$items = $refund->get_items();
if (!empty($items)) {
foreach ($items as $item) {
$i++;
$product_id = !empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
$refund_items_data[] = $this->get_product_details($product_id, $item['qty'], $i);
}
}
$total_refund = 0;
$refund_value = $refund->get_amount();
if (!empty($refund_items_data) && is_array($refund_items_data)) {
foreach ($refund_items_data as $refund_item) {
$total_refund = $total_refund + ($refund_item['quantity'] * $refund_item['price']);
}
}
if ($total_refund == $refund_value) {
$params = array(
'coupon' => $this->ga4wp_esc($coupons_list),
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'items' => $refund_items_data,
'transaction_id' => $this->ga4wp_esc($order->get_order_number()),
'value' => $this->ga4wp_esc($refund->get_amount()),
);
} else {
$params = array(
'coupon' => $this->ga4wp_esc($coupons_list),
'currency' => $this->ga4wp_esc(get_woocommerce_currency()),
'transaction_id' => $this->ga4wp_esc($order->get_order_number()),
'value' => $this->ga4wp_esc($refund->get_amount()),
);
}
foreach ($params as $key => $value) {
if (empty($value)) {
unset($params[$key]);
}
}
$params = json_encode($params);
$ga4wp_analytics_code = 'gtag("event", "refund",' . $params . ');';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
update_post_meta($refund_id, 'ga4wp_refund_already_tracked', 'yes');
}
}
/* Logging Errors */
public function log_error($error)
{
if (!is_array($error)) {
return;
}
if (!empty($this->api_secret)) {
$this->data = $this->init_default_params();
$this->data['events'][0] = array(
'name' => 'error_occured',
);
$this->making_remote_request();
$this->params = null;
$this->data = null;
} else {
$ga4wp_analytics_code = 'gtag("event", "error_occured", {});';
$this->ga4wp_set_transient($ga4wp_analytics_code);
}
}
public function ga4wp_esc($string)
{
if (!empty($string)) {
$string = str_replace(array('"', ';', '<', '>'), ' ', $string);
$string = trim(preg_replace('/\s+/', ' ', $string));
}
return $string;
}
}