Электронная коммерция Яндекс.Метрики в 1С-Битрикс с поддержкой Google Tag Maganer (GTM)
В продолжении темы «Добавление кода Google Analytics для отслеживания заказов». Но тут мы будем учитывать заказы в метрике Яндекса. Замечу: этот вариант автоматом заработает, если вы уже настроили отправку данных в Google Analytics Enhanced Ecommerce и включили Ecommerce в Яндекс.Метрике.
Как и всегда — решением будет php-обработчик.
Подписываемся
\Bitrix\Main\EventManager::getInstance()->addEventHandler('sale', 'OnSaleComponentOrderOneStepFinal', array('\Olegpro\Handlers\Sale\OrderAjaxComponent', 'AddYandexMetricsEcommerceCode') );
Код обработчика
/** * Created by olegpro.ru. * User: Oleg Maksimenko <oleg.39style@gmail.com> * Date: 05.05.2016 22:58 */ namespace Olegpro\Handlers\Sale; use Bitrix\Main\SiteTable; use Bitrix\Main\Application; class OrderAjaxComponent { /** * @param $orderId * @param $arOrder * @param $arParams */ function AddYandexMetricsEcommerceCode($orderId, $arOrder, $arParams) { global $APPLICATION; if (isset($_SESSION['YM_ORDER_ID']) && $_SESSION['YM_ORDER_ID'] == $orderId) { return; } if (!($order = \CSaleOrder::GetByID($orderId))) { return; } $site = SiteTable::getRowById($arOrder['LID']); $server = Application::getInstance()->getContext()->getServer(); $output = [ 'ecommerce' => [ 'currencyCode' => (string)$order['CURRENCY'], 'purchase' => [ 'actionField' => [ 'id' => (int)$order['ID'], 'affiliation' => (is_array($site) ? $site['NAME'] : $server->getHttpHost()), 'revenue' => (float)$order['PRICE'], 'tax' => 0.00, 'shipping' => (float)$order['PRICE_DELIVERY'], // 'goal_id' => 19768025, ], 'products' => [], ], ] ]; $basketIterator = \CSaleBasket::GetList( array( 'NAME' => 'ASC', ), array( 'ORDER_ID' => $orderId, ), false, false, array( 'PRODUCT_ID', 'NAME', 'PRICE', 'QUANTITY', ) ); $basketItems = array(); $productsIds = array(); $productsData = array(); while ($basketItem = $basketIterator->fetch()) { $basketItems[] = $basketItem; $productsIds[] = $basketItem['PRODUCT_ID']; } unset($basketItem); $resProducts = \CIBlockElement::GetList( array(), array( 'ID' => array_unique($productsIds) ), false, false, array( 'ID', 'IBLOCK_ID', 'IBLOCK_SECTION_ID', ) ); while ($arProduct = $resProducts->Fetch()) { $arProduct['SECTION_NAME'] = ''; if (intval($arProduct['IBLOCK_SECTION_ID']) > 0) { $sectionIterator = \CIBlockSection::GetList( array(), array( 'ID' => $arProduct['IBLOCK_SECTION_ID'], ), false, array( 'NAME', ) ); if ($arSection = $sectionIterator->Fetch()) { $arProduct['SECTION_NAME'] = $arSection['NAME']; } } $productsData[$arProduct['ID']] = $arProduct; } foreach ($basketItems as $basketItem) { $output['ecommerce']['purchase']['products'][] = [ 'id' => (int)$basketItem['PRODUCT_ID'], 'name' => (string)$basketItem['NAME'], 'category' => (string)(isset($productsData[$basketItem['PRODUCT_ID']]) ? $productsData[$basketItem['PRODUCT_ID']]['SECTION_NAME'] : ''), 'price' => (float)$basketItem['PRICE'], 'quantity' => (int)$basketItem['QUANTITY'], ]; } \Bitrix\Main\Page\Asset::getInstance()->addString( '<script>(window.dataLayer || []).push(' . \CUtil::PhpToJSObject($output, false, true, true) . ')</script>', true ); $_SESSION['YM_ORDER_ID'] = $orderId; } }
Примечание
Если вызов функции:
$APPLICATION->ShowHead()
идет в шаблоне выше, чем код яндекс метрики, то строку:
\Bitrix\Main\Page\Asset::getInstance()->addString( '<script>(window.dataLayer || []).push(' . \CUtil::PhpToJSObject($output, false, true, true) . ')</script>', true );
следует заменить на:
echo '<script>(window.dataLayer || []).push(' . \CUtil::PhpToJSObject($output, false, true, true) . ')</script>';
18 комментариев
Спасибо! Отличное решение! Добавил себе в заметки
Подскажите, в каком файле выводить этот код обработчика?
Посмотрите в предыдущем посте https://www.olegpro.ru/post/1c_bitriks_dobavlenie_koda_google_analytics_dlya_otslezhivaniya_zakazov.html
Там указано где и как размещать файлы, сделайте по аналогии
Протестил и Яндекс и Гугл. Работает на ура. Отличные статьи, спасибо большое:-)
Здравствуйте!
сохранил код обработчика в /local/php_interface/classes/handlers/orderajaxcomponenthandler.php
в /local/php_interface/init.php прописал в самом низу echo ''; (пробовал и \Bitrix\Main\Page\Asset::getInstance()->addString( '', true );
ну и счётчик Метрики с включённой коммерцией вставил в footer.php
никакие данные не передаются в Метрику. что-то не так сделал?
точнее код Метрики в Тэг-мэнэджер вставил.
В самом низу чего прописали? Файла init.php и класса?
Ну а вообще, открываете инспектор и смотрите.
Олег, спасибо за ответ! нет, просто в самом низу файла init.php а в какой класс надо? и ещё, скажите, пожалуйста, фраза: "с поддержкой Google Tag Maganer (GTM)" означает, что на сайте должен стоять код Тэг Мэнэджера? код Метрики можно просто в подвал вставить или через Тэг Мнэджер лучше?
Читайте внимательнее заметку (она рассчитана всё-таки на технических специалистов).
Не обязательно.
Без разницы.
Огромное спасибо за Ваш обработчик. Потребовалась небольшая модификация кода, но в остальном всё работает отлично.
Подскажите как реализовать отправку заказа через форму купить в 1 клик. Через оформление корзины данные отправляются, а через форму нет
Скорее всего, оформляя заказ через форму купить в 1 клик, не вызывается событие OnSaleComponentOrderOneStepFinal (на которое рассчитана заметка).
Да не вызывается, пробовал через OnSaleOrderEntitySaved. Но тоже не работает
А для добавления в корзину нет рабочего решения?
Нет.
С добавлением в корзину не всё так однозначно.
Скажите, если не могу добраться до init.php (доступ есть только в админку) - где прописать код, подключающий обработчик? Простите, вопрос совсем от новичка (я вообще рекламой занимаюсь, нужно настроить эл. коммерцию, а программиста нет).
у меня не сработало. Ошибок явных не выдает. Как вообще отлаживать события? в лог-файл писать промежуточные результаты? или как то еще..
Дина, вариантов масса.
Самое простое: