Настройка E-commerce Google Analytics на OpenCart 2.x – 3.x

Электронная торговля в Google Analytics позволяет нам собирать данные о транзакциях на сайте. С помощью электронной торговли мы можем узнать:

  1. Какой товар покупают.
  2. Количество товара.
  3. Сумму заказа.
  4. Популярные товары.
  5. Категорию товара.

Рассмотрим настройку Электронной торговли для CMS OpenCart 2.x-3.x при помощи двух методов –  ga.js и gtag.js.

 Метод Ga.js 

Электронная торговля для CMS OpenCart 2.x-3.x, метод ga.js. Для того чтобы начать установку, на сайте должен быть установлен счетчик Google Analytics:

<!-- Google Analytics -->

<script>

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){

  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),

  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)

  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-XXXXXXXXX', 'auto');  

ga('send', 'pageview');

</script>

<!-- Google Analytics -->

Настройка будет в три этапа. Нам нужно будет изменить некоторые файлы на сайте, добавив необходимые коды.

Первый файл который будем изменять order.php, находится в директории catalog/model/checkout/order.php 

В нем добавляем следующий код (который будет генерировать и отображать нам данные):

public function getOrderGAC($order_id) {

        $order_query = $this->db->query("SELECT o.order_id, o.store_name, o.language_id, o.currency_code, o.currency_value, o.total FROM `" . DB_PREFIX . "order` o WHERE o.order_id = '" . (int)$order_id . "'"); 

        if ($order_query->num_rows) {

            $language_id = $order_query->row['language_id'];          

            $order_product_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_product WHERE order_id = '" . (int)$order_id . "'"); 

            foreach ($order_product_query->rows as $product) {

                $option_data = ''; 

                $order_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_option WHERE order_id = '" . (int)$order_id . "' AND order_product_id = '" . (int)$product['order_product_id'] . "'");

                 foreach ($order_option_query->rows as $option) {

                    if ($option['type'] != 'file') {

                        $option_data .= $option['name'] . ': ' . (utf8_strlen($option['value']) > 20 ? utf8_substr($option['value'], 0, 20) . '..' : $option['value']) . ' - ';

                    }

                } 

                $option_data = rtrim($option_data, ' - '); 

                $category_data = ''; 

                $category_query = $this->db->query("SELECT cd.name FROM `" . DB_PREFIX . "product_to_category` pc INNER JOIN `" . DB_PREFIX . "category_description` cd ON pc.category_id = cd.category_id WHERE pc.product_id = '" . (int)$product['product_id'] . "' AND cd.language_id = '" . (int)$language_id . "'"); 

                $i = 0;

                foreach ($category_query->rows as $category) {

                    $i++;

                    if ($i <= 5) {

                        $category_data .= $category['name'] . '/';

                    }

                } 

                $category_data = rtrim($category_data, '/');              

                if ($option_data) {

                    $name = utf8_substr($product['name'] . ' - ' . $option_data, 0, 80);

                } else {

                    $name = utf8_substr($product['name'], 0, 80);

                } 

                $products[] = array(

                    'name'     => $name,

                    'sku'      => $product['model'],

                    'category' => $category_data,

                    'price'    => $this->currency->format($product['price'] + ($this->config->get('config_tax') ? $product['tax'] : 0), false, $order_query->row['currency_value']),

                    'quantity' => $product['quantity']

                );

            } 

            return array(

                'order_id'      => $order_query->row['order_id'],

                'store_name'    => $order_query->row['store_name'],

                'products'      => $products,

                'total'         => $this->currency->format($order_query->row['total'], false, $order_query->row['currency_value']),

                'currency_code' => $order_query->row['currency_code']

            );

        } else {

            return false;

        }  

    }

Второй файл который будем править – success.php в директории catalog/controller/checkout/success.php 

В нем добавляем следующий код (данный код будет считывать данные из кода который установили первым):

$data['gaTracking'] = ''; 

        if (isset($this->session->data['order_id'])) {

            $this->load->model('checkout/order'); 

            $orderInfo  = $this->model_checkout_order->getOrderGAC($this->session->data['order_id']); 

            if ($orderInfo) {

                $data['gaTracking'] .= sprintf("ga('ecommerce:addTransaction', {'id': '%s', 'affiliation': '%s', 'revenue': '%s', 'currency': '%s'});",

                                                    $orderInfo['order_id'],

                                                    $orderInfo['store_name'],

                                                    $orderInfo['total'],

                                                    $orderInfo['currency_code']

                                                    ) . "\n";

                $data['gaTracking'] = rtrim($data['gaTracking'], '\n');

                foreach ($orderInfo['products'] as $product) {

                    $data['gaTracking'] .= sprintf("ga('ecommerce:addItem', {'id': '%s', 'name': '%s', 'sku': '%s', 'category': '%s', 'price': '%s', 'quantity': '%s', 'currency': '%s'});",

                                                        $orderInfo['order_id'],

                                                        $product['name'],

                                                        $product['sku'],

                                                        $product['category'],

                                                        $product['price'],

                                                        $product['quantity'],

                                                        $orderInfo['currency_code']

                                                        ) . "\n";

                }

            }

        }

Третий и последний файл который нужно править success.tpl в директории – catalog/view/theme/***********/template/common/success.tpl

****** – Это папка с Вашей Темой. 

В нем добавляем следующий код (который будет на странице “спасибо за заказ” и после отправки данных будет закрывать передачу, чтобы при обновлении страницы избежать дублирования транзакции):

<?php

if(isset($gaTracking)) {

if($gaTracking) {

echo "<script>" . "\n";

echo "ga('require', 'ecommerce');" . "\n";

echo $gaTracking;

echo "ga('ecommerce:send');" . "\n";

echo "</script>" . "\n";

}

}

?>

Изменение файлов мы закончили, теперь нужно включить все в Google Analytics:  Администратор – Представление – Настройка Электронной торговли.

Включаем отслеживания электронной торговли.

Включаем отслеживания электронной торговли.

Включаем отслеживания электронной торговли.

Наша настройка Электронной торговли завершена. Если у Вас не получается либо вы не имеете опыта в редактировании файлов, можно сделать с помощью готового модификатора который вы можете скачать – Модификатор Метод GA.js

Как установить модификатор? Нам нужно перейти в админ панель управления сайтом она доступна по ссылке: https://**************/admin/
******** – домен вашего сайта.

В Админ панели выбираем пункт: Модули – Установка расширений. Мы попадаем в окно установки.

Установка расширений.

Теперь выбираем загрузить файл и выбираем скачанный нами файл.

И ждем когда завершиться процес установки. Все мы установили наши настройки. 

В результате мы получаем в Google Analytics наши транзакции. 

Транзакции в Google AnalyticsМетод Gtag.js 

Электронная торговля для CMS OpenCart 2.x-3.x метод gtag.js. В первую очередь должен быть установлен счетчик на сайте:

<!-- Global site tag (gtag.js) - Google Analytics -->

<script async src="https://www.googletagmanager.com/gtag/js?id=UA-74590809-2"></script>

<script>

  window.dataLayer = window.dataLayer || [];

  function gtag(){dataLayer.push(arguments);}

  gtag('js', new Date()); 

  gtag('config', 'UA-XXXXXXXXXX');

</script>

Тут все тоже самое как с предыдущим методом – изменяем файлы или скачиваем модификатор и устанавливаем его.

Настройка будет также в три этапа.

Первый файл который будем изменять находится в директории catalog/model/checkout/order.php

 В нем добавляем следующий код (который будет генерировать и отображать нам данные):

public function getGTAG($order_id) {

            $order_query = $this->db->query("SELECT o.order_id, o.store_name, o.language_id, o.currency_code, o.currency_value, o.total FROM `" . DB_PREFIX . "order` o WHERE o.order_id = '" . (int)$order_id . "'");

            if ($order_query->num_rows) {

                $language_id = $order_query->row['language_id'];

                $currency_value = $order_query->row['currency_value']; 

                $order_product_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_product WHERE order_id = '" . (int)$order_id . "'");

                foreach ($order_product_query->rows as $product) {

                    $i = 0;

                    $category_data = '';

                    $category_query = $this->db->query("SELECT cd.name FROM `" . DB_PREFIX . "product_to_category` pc INNER JOIN `" . DB_PREFIX . "category_description` cd ON pc.category_id = cd.category_id WHERE pc.product_id = '" . (int)$product['product_id'] . "' AND cd.language_id = '" . (int)$language_id . "'");

                    foreach ($category_query->rows as $category) { $i++;

                        if ($i <= 5) {

                            $category_data .= $category['name'] . '/';

                        }

                    }

                    $category_data = rtrim($category_data, '/'); 

                    $option_data = '';

                    $order_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_option WHERE order_id = '" . (int)$order_id . "' AND order_product_id = '" . (int)$product['order_product_id'] . "'");

                    foreach ($order_option_query->rows as $option) {

                        if ($option['type'] != 'file') {

                            $option_data .= $option['name'] . ': ' . (utf8_strlen($option['value']) > 20 ? utf8_substr($option['value'], 0, 20) . '..' : $option['value']) . ' - ';

                        }

                    }

                    $option_data = rtrim($option_data, ' - '); 

                    $products[] = array(

                        'id' => $product['model'],

                        'name' => $product['name'],

                        'category' => $category_data,

                        'variant' => $option_data,

                        'price' => (($product['price'] + ($this->config->get('config_tax') ? $product['tax'] : 0)) * $currency_value),

                        'quantity' => $product['quantity']

                    );

                } 

                $order_shipping = 0;

                $order_total_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "order_total` WHERE order_id = '" . (int)$order_id . "' ORDER BY sort_order ASC");

                foreach ($order_total_query->rows as $total) {

                    if ($total['value'] > 0) {

                        if ($total['code'] == "shipping") {

                            $order_shipping += $total['value'];

                        }

                    }

                } 

                return array(

                    'transaction_id' => $order_query->row['order_id'],

                    'affiliation' => $order_query->row['store_name'],

                    'value' => $order_query->row['total'] * $currency_value,

                    'currency' => $order_query->row['currency_code'],

                    'shipping' => $order_shipping * $currency_value,

                    'items' => $products

                );

            } else {

                return false;

            }

        } 

Второй файл для правки success.phpcatalog/controller/checkout/success.php

 В нем добавляем следующий код (который будет считывать данные из кода, который установили первым):

$data['gtag_event'] = ''; 

        if (isset($this->session->data['order_id'])) {

            $gtag = false; 

            if ($this->config->get('google_analytics_status')) {

                $gtag = true;

            } else if ($this->config->get('config_google_analytics_status')) {

                $gtag = true;

            } else if ($this->config->get('config_google_analytics')) {

                $google_analytics = $this->config->get('config_google_analytics');

                if (!empty($google_analytics)) {

                    $gtag = true;

                }

            } 

            if ($gtag) {

                $this->load->model('checkout/order');

                $event_info = $this->model_checkout_order->getGTAG($this->session->data['order_id']);

 

                if ($event_info) {

                    $data['gtag_event'] .= '<script>'."\n";

                    $data['gtag_event'] .= 'gtag(\'event\', \'purchase\', {'."\n";

                    $data['gtag_event'] .= sprintf('"transaction_id": "%s", "affiliation": "%s", "value": %s, "currency": "%s", "shipping": %s,', $event_info['transaction_id'], $event_info['affiliation'], $event_info['value'], $event_info['currency'], $event_info['shipping'])."\n";

                    if (isset($event_info['items']) && is_array($event_info['items'])) {

                        $data['gtag_event'] .= '"items": [ '."\n";

                        foreach ($event_info['items'] as $item) {

                            $data['gtag_event'] .= sprintf('{ "id": "%s", "name": "%s", "category": "%s", "variant": "%s", "quantity": %s, "price": "%s" },', $item['id'], $item['name'], $item['category'], $item['variant'], $item['quantity'], $item['price'])."\n";

                        }

                        $data['gtag_event'] .= ' ]'."\n";

                    }

                    $data['gtag_event'] .= ' });'."\n";

                    $data['gtag_event'] .= '</script>';

                }

            }

        }

Третий и последний файл который нужно править catalog/view/theme/***********/template/common/success.tpl

****** – папка с Вашей Темой.

 В нем добавляем следующий код (который будет на странице “спасибо за заказ” активировать второй код, и после отправки данных будет закрывать передачу, чтобы при обновлении страницы не было дублей в передаче данных):

 <?php if (isset($gtag_event) && !empty($gtag_event)) { echo $gtag_event; } ?>

Наша настройка Электронной торговли завершена методом gtag.js. Также можете скачать готовый модификатор – Модификатор метод Gtag.js

Установку делаем как описано в методе ga.js, разницы между установками и настройками куда и что ставить нет.

Разница между методами в разном написании написании кода.

Если у Вас не получилось или остались вопросы пишите в комментариях.

Коды безопасны и актуальны, взяты на GitHub: https://github.com/opencartbrasil/google-analytics-ecommerce/blob/master/install.xml

Tags: , ,

26 thoughts on “Настройка E-commerce Google Analytics на OpenCart 2.x – 3.x

    1. Нет единого решения, что и как. По этому описывается основной принцип настройки, а далее уже нужно смотреть при установке.

      1. Полностью согласен. Было бы неплохо намекнуть, куда приблизительно вставлять код. Меня выручило бесплатное дополнение, которое правда пришлось доработать для push. https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=31361
        Жаль, что по ремаркетингу нет таких замечательных статей.

        1. Тут не получится намекнуть, к сожалению((. По ссылке – то уже идет настройка с GTM, а статья написана о настройке без GTM. Так же мы прикрепили модуль, который вы можете установить и все будет работать, ссылка есть в статьи. Насчет ремаркетинга почему нет статьи, есть посмотрите в нас в блоге https://sawyer.marketing/blog/nastrojka-dinamicheskogo-remarketinga-google-ads/

  1. Добрый день! Спасибо за статью. Можно теперь для GTM раскрыть информацию, как сам тег настроить передачи этих переменных?

    1. Как я выше в Коментарии писал этот метод и переменные не имеют ничего общего к GTM. Соответственно переменные которые есть в статьи вы ни как не передадите через GTM. Для настройки и передачи данных E-COMMERCE через GTM используется другой тип переменных и масив уровня данных.

  2. Добрый день! Установил модификатор методом GTAG.JS, правда в архиве файл назывался install.xml, переименовал его в google_analytics_ecommerce.ocmod.xml.
    Файл успешно установился но пока проверить работает или нет не могу т.к. данные не подтягиваются (сделал 2 тестовых заказа со статусом – сделка завершена, прошло часа 2).
    Сколько нужно подождать что бы данные отобразились?

    1. Добрый день. Передача данных может идти с задержкой до 48 часов, такие правила Google Analytics. Так же задержка будет если вы на новый аккаунт делали настройку. Так же проверьте включена ли сама Торговля в представлении Google Analytics. Так же видим что у вас идет повторная передача данных https://prnt.sc/uxs4it , это может давать не точные данные о действию пользователя на сайте.

      1. Добрый день! Данные до сих пор не отобразились, из процесса установки что я описывал выше, какие мог допустить ошибки?
        Код счетчика установлен gtag.js, файл настройки методом gtag.js.
        Файл в архиве назывался install.xml, переименовал его в google_analytics_ecommerce.ocmod.xml(как в
        1м архиве).
        Файл установился успешно.

  3. День добрій. Установил, но на последней странице странице , появился кусок кода – ” . “\n”; echo “ga(‘require’, ‘ecommerce’);” . “\n”; echo $gaTracking; echo “ga(‘ecommerce:send’);” . “\n”; echo “” . “\n”; } } ?>
    Что делать? )

    Заранее благодарен за помощь.

    1. Сергей здравствуйте. На simple там другая логика настройки. На страницу спасибо за заказ нужно установить код электроной комерции. Напишите контакт свой и наш менеджер вам поможет с установкой.

  4. Здравствуйте, подскажите пожалуйста, что-то нужно сделать с файлом install.xml? тк я установила модуль (google_analytics_ecommerce.ocmod.xml) а данные не передаются в аналитику… . Возможно нужно что-то еще сделать , а не просто установить модуль? Буду очень благодарна за ответ и рекомендацию.

      1. Здравствуйте, тема NewStore v.2.6.0 , Версия ocStore 2.1.0.2.1 – плагин работает но теряются данные… те доход не весь учитывается. Есть дни где продажи на общую сумму 300 грн, а в гугл аналитику попадает 50 грн напрмер.. (1 продажа на сумму 250 грн потерялась…). Почему могут теряться данные и как это поправить?

        1. Добрый день. Отвечу тут сразу на два Ваши комментария. Теряться могут иза того что плагин аналитики не адаптивный под вашу тему (это часто бывает), так же может быть что страница спасибо за заказ не прогружает код електроной торговли. Чтоб сказать точно нужно посмотреть Ваш сайт.

          1. Евгений, спасибо за ответ. Действительно я проследила и в доход не попадает заказы сделанные чз общую корзину (правый верхний угол) а чз быстрый заказ доход отображается…. Подскажите пожалуйста как я могу это исправить и настроить что бы и данные с общей корзины передавались в доход аналитики?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *