Коллеги, кто юзает этот модуль в странах где есть Google реклама.
И отправляет только ОПЛАЧЕННЫЕ заказы в аналитику.
Чтобы Google не привлекал потом аудитории долбней, которые хотят получить холодильник в зажопинске без предоплаты и аннулируют заказ, когда с них просишь хотя бы 10 баксов предоплаты.
Добавил себе некоторую оптимизацию, чтобы отправлялся timestamp времени заказ, если еще не прошло 72 часа с момента его оформления.
72 часа потому что больше Google не принимает через measurment.
В надежде, что так Google данные понравятся больше, чем когда отправляется событие покупки через пару дней, когда покупатель таки оплатил и менеджер поставил нужный статус заказу.
Т.к. в таком случае для Google это выглядит как будто юзер накидал товаров в корзину, потом исчез на 2 дня и тут хопа заказ! Даже без посещения сайта.
вот в этом файле /app/addons/sd_google_analytics/func.php
заменяем функцию fn_sd_ga_send на вот это
вдруг кому пригодится или кто из знатоков скажет, что год кривой…
function fn_sd_ga_send($accounts, $order_info, $identification_type, $refuse = false, $refund = false, $vendor_accounts = [])
{
$is_ga4 = fn_sd_ga_is_ga4(Registry::get('addons.sd_google_analytics.tracking_code'));
if ($order_info) {
//mymymy Получение временной метки заказа из $order_info
$timestamp = isset($order_info['timestamp']) ? $order_info['timestamp'] : time();
$current_time = time();
$time_difference = $current_time - $timestamp;
// Проверка прошествия 72 часов с момента оформления заказа
if ($time_difference > (72 * 3600 - 100)) {
// Если прошло более 72 часов, отправляем текущее время
$timestamp = $current_time;
}
$timestamp_micros = $timestamp * 1000000;
$cache_buster = ['z' => mt_rand(1, 99999),];
$required_data = [
'v' => '1',
'ti' => $order_info['order_id'],
'cu' => Registry::get('currencies.' . CART_PRIMARY_CURRENCY . '.currency_code'),
'tsm' => $timestamp_micros, // Добавлено время заказа или текущее время, если прошло более 72 часов
];
if (empty($order_info['sd_ga_cid'])) {
$required_data['cid'] = md5($order_info['email']);
$required_data['ni'] = 1;
} else {
$required_data['cid'] = $order_info['sd_ga_cid'];
}
$company_name = fn_get_company_name($order_info['company_id']);
$coupons = isset($order_info['coupons']) ? implode(', ', (array_keys($order_info['coupons']))) : '';
$sign = ($refuse) ? '-' : '';
if ($refund) {
fn_sd_ga_refund($accounts, $order_info, $identification_type, $is_ga4, null, $vendor_accounts);
if ($is_ga4) {
return;
}
}
$event = ['t' => 'event', 'ec' => 'Ecommerce', 'ea' => 'purchase',];
$transaction = [
'ta' => $company_name,
'tr' => $sign . $order_info['total'],
'ts' => $sign . $order_info['shipping_cost'],
'tt' => $sign . $order_info['tax_subtotal'],
'tcc' => $coupons,
];
$purchase = ['pa' => ProductActions::PURCHASE,];
if (!empty($order_info['products'])) {
list($purchase_data, $ga4_items) = fn_sd_ga_get_transaction_purchase($order_info['products'], $identification_type, $required_data, $sign);
}
$purchase = array_merge($purchase, $purchase_data);
$promotions = empty($order_info['promotions']) ? [] : fn_sd_ga_get_transaction_promotions($order_info['promotions']);
$data = array_merge($event, $transaction, $purchase, $promotions, $cache_buster);
$json_params = [
'client_id' => $required_data['cid'],
'timestamp_micros' => strval($required_data['tsm']), // Добавлено время заказа или текущее время, если прошло более 72 часов
'events' => [
'name' => 'purchase',
'params' => [
'coupon' => $transaction['tcc'],
'currency' => $required_data['cu'],
'items' => $ga4_items,
'transaction_id' => $order_info['order_id'],
'shipping' => $transaction['ts'],
'tax' => $transaction['tt'],
'value' => $transaction['tr'],
],
],
];
if ($is_ga4) {
fn_sd_ga_ga4_post_request($json_params);
} else {
fn_sd_ga_request($accounts, $required_data, $data);
}
if (!empty($vendor_accounts['sd_ga_tracking_code']) && !empty($vendor_accounts['sd_ga_api_secret'])) {
fn_sd_ga_ga4_vendors_post_request($vendor_accounts['sd_ga_tracking_code'], $vendor_accounts['sd_ga_api_secret'], $json_params);
}
}
}
Вроде работает.