Отслеживание электронной торговли в Google Analytics

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

dabustard
dabustard
Репутация: 4
Сообщения: 25
Зарегистрирован: 26.01.2018
С нами: 1 год 2 месяца

Сообщение #1 dabustard » 08.04.2019, 14:04

Всем привет.

Подключил в Google Analytics отслеживание электронной торговли для сайта и столкнулся с проблемой дублирования заказов.

На страницу оформленного заказа (order.tpl) добавил специальный скрипт (см.ниже), информация о заказах стала успешно появляться в GA, однако заметил, что количество товаров в некоторых заказах в системе больше, чем реально оформлено на сайте.

Была уверенность, что при перезагрузке страницы с заказом или открытии его по ссылке из письма-подтверждения, выполненный скрипт дубля не создаст, так как Google Analytics будет сопоставлять их по transaction_id, однако оказалось, что это не совсем так.

Дубли не создаются, однако в имеющиеся в базе GA заказы, при каждом обновлении страницы добавляется еще один набор товаров из этого заказа.

Скрипт добавленный на страницу выглядит так:

Код: Выделить всё

<script>
{literal}
gtag('event', 'purchase', {
  'transaction_id': '{/literal}{$order->id}{literal}',
  'value': {/literal}{$order->total_price}{literal},
  'items': [
  {/literal}{foreach $purchases as $purchase}{literal}
    {
      'id': '{/literal}{$purchase->variant->id}{literal}',
      'name': '{/literal}{$purchase->product_name|escape}{literal}',
      'variant': '{/literal}{$purchase->variant_name|escape}{literal}',
      'quantity': {/literal}{$purchase->amount|escape}{literal},
      'price': '{/literal}{$purchase->variant->price}{literal}'
    },
  {/literal}{/foreach}{literal}
  ]
});
{/literal}
</script>

Подскажите, где лучше разместить этот скрипт, чтобы при оформлении заказа он выполнялся всего один раз?

korshunov
korshunov
Репутация: 99
Сообщения: 959
Зарегистрирован: 03.12.2015
С нами: 3 года 4 месяца
Skype

Сообщение #2 korshunov » 09.04.2019, 06:16

Разместить его надо там же в order.tpl, но не всегда, а только при первом открытии страницы заказа.
Подобный вопрос рассмотрен тут
http://forum.simplacms.ru/topic/13791-страница-подтверждения-заказа/?p=108628

dabustard
dabustard
Репутация: 4
Сообщения: 25
Зарегистрирован: 26.01.2018
С нами: 1 год 2 месяца

Сообщение #3 dabustard » 10.04.2019, 09:26

korshunov писал(а):Разместить его надо там же в order.tpl, но не всегда, а только при первом открытии страницы заказа.
Подобный вопрос рассмотрен тут
http://forum.simplacms.ru/topic/13791-страница-подтверждения-заказа/?p=108628
Спасибо за ссылку! Этот вариант частично решает проблему: по ссылке из письма срабатывания скрипта не будет, но при простой перезагрузке страницы после оформления заказа оно естественно остается.

Пробовал еще разместить скрипт на странице корзины и повесить его выполнение на onSubmit формы оформления заказа, но там нет номера заказа, а он нужен обязательно...

korshunov
korshunov
Репутация: 99
Сообщения: 959
Зарегистрирован: 03.12.2015
С нами: 3 года 4 месяца
Skype

Сообщение #4 korshunov » 10.04.2019, 10:08

Чтобы при перезагрузке страницы не портилась картина, надо вести учет более точно. В базе у заказа завести новое поле, в котором ставить отметку, открывалась ли страница заказа. И если да, то скрипт не выводить...

dabustard
dabustard
Репутация: 4
Сообщения: 25
Зарегистрирован: 26.01.2018
С нами: 1 год 2 месяца

Сообщение #5 dabustard » 12.04.2019, 16:08

korshunov писал(а):Чтобы при перезагрузке страницы не портилась картина, надо вести учет более точно. В базе у заказа завести новое поле, в котором ставить отметку, открывалась ли страница заказа. И если да, то скрипт не выводить...
Надеялся, что можно как-то попроще реализовать... Понаблюдаю пока будут ли дубли после внесения параметра в url. :)

korshunov
korshunov
Репутация: 99
Сообщения: 959
Зарегистрирован: 03.12.2015
С нами: 3 года 4 месяца
Skype

Сообщение #6 korshunov » 12.04.2019, 17:00

Оно вроде бы и не сильно сложно.
Вот тут похожий вопрос рассматривался, методы можно почерпнуть:
http://forum.simplacms.ru/topic/1086-количество-просмотров-товаров/

dabustard
dabustard
Репутация: 4
Сообщения: 25
Зарегистрирован: 26.01.2018
С нами: 1 год 2 месяца

Сообщение #7 dabustard » 15.04.2019, 14:03

korshunov писал(а):Оно вроде бы и не сильно сложно.
Вот тут похожий вопрос рассматривался, методы можно почерпнуть:

И снова Вы правы :) Благодарю в очередной раз!

Опишу здесь, возможно кому-то пригодится:

1) В phpMyAdmin выполняем запрос к БД, добавляющий новое поле view в таблицу orders (не забудьте заменить prefix на префикс таблиц в вашей БД) :

Код: Выделить всё

ALTER TABLE `prefix_orders` ADD `views` INT(11) NOT NULL DEFAULT '0' AFTER `lang_id`;

2) в файле /api/Orders.php, в функции get_order добавляем запрос нового поля views:
то есть меняем это:

Код: Выделить всё

 $query = $this->db->placehold("SELECT 
                o.id,
                o.delivery_id,
                o.delivery_price,
                o.separate_delivery,
                o.payment_method_id,
                o.paid,
                o.payment_date,
                o.closed,
                o.discount,
                o.coupon_code,
                o.coupon_discount,
                o.date,
                o.user_id,
                o.name,
                o.address,
                o.phone,
                o.email,
                o.comment,
                o.status_id,
                o.url,
                o.total_price,
                o.note,
                o.ip,
                o.lang_id

на это:

Код: Выделить всё

 $query = $this->db->placehold("SELECT 
                o.id,
                o.delivery_id,
                o.delivery_price,
                o.separate_delivery,
                o.payment_method_id,
                o.paid,
                o.payment_date,
                o.closed,
                o.discount,
                o.coupon_code,
                o.coupon_discount,
                o.date,
                o.user_id,
                o.name,
                o.address,
                o.phone,
                o.email,
                o.comment,
                o.status_id,
                o.url,
                o.total_price,
                o.note,
                o.ip,
                o.lang_id,
                o.views

3) в этом же файле (/api/Orders.php), в самом конце добавляем новую функцию update_oviews:

Код: Выделить всё

   /*Обновление кол-ва просмотров заказа*/
   public function update_oviews($id)
   {
   $this->db->query("UPDATE __orders SET views=views+1 WHERE id=?", $id);
   return true;
   }    

4) в файле /view/OrderView.php, функцию fetch_order дополняем двумя строками:

Код: Выделить всё

    /*Отображение оформленного заказа*/
    public function fetch_order() {
        if($url = $this->request->get('url', 'string')) {
            $order = $this->orders->get_order((string)$url);
            $this->orders->update_oviews(intval($order->id));//просмотры заказа +1
        } elseif(!empty($_SESSION['order_id'])) {
            $order = $this->orders->get_order(intval($_SESSION['order_id']));
            $this->orders->update_oviews(intval($_SESSION['order_id']));//просмотры заказа +1
        } else {
            return false;
        }

5) Ну и, наконец, в шаблоне вывода информации о заказе добавляем сам тег Google Analitics, обернутый условием:

Код: Выделить всё

{if $order->views <1}
{literal}
<script>
gtag('event', 'purchase', {
  'transaction_id': '{/literal}{$order->id}{literal}',
  'value': {/literal}{$order->total_price}{literal},
  'items': [
  {/literal}{foreach $purchases as $purchase}{literal}
    {
      'id': '{/literal}{$purchase->variant->id}{literal}',
      'name': '{/literal}{$purchase->product_name|escape}{literal}',
      'variant': '{/literal}{$purchase->variant_name|escape}{literal}',
      'quantity': {/literal}{$purchase->amount|escape}{literal},
      'price': '{/literal}{$purchase->variant->price}{literal}'
    },
  {/literal}{/foreach}{literal}
  ]
});
</script>
{/literal}
{/if}


Название раздела: Вопросы по работе с OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Вопросы по работе с OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость