Реализовать согласно инструкции:
Для настройки кода динамического ремаркетинга на сайте должен срабатывать следующий скрипт:
?
1 2 3 4 5 6 7 8 | <script>
window.dataLayer = window.dataLayer || [];
dataLayer.push({
dynx_itemid: 'REPLACE_WITH_VALUE',
dynx_pagetype: 'REPLACE_WITH_VALUE',
dynx_totalvalue: 'REPLACE_WITH_VALUE'
});
</script>
|
Описание параметров можно подробнее почитать в описании от Google.
Вкратце, в "REPLACE_WITH_VALUE" нужно подтянуть данные о том, на какой странице находится пользователь и информацию о товаре.
dynx_itemid - идентификатор (ID) товара - идентификатор должен совпать с ID товара в базе данных сайта. Данный параметр подтягивается только на страницах товаров, в корзине и на странице завершения покупки. Если в корзину добавлены 2 товара, то идентификаторы перечисляются в формате:
?
1 | dynx_itemid: [‘114247’, ‘128713’],
|
dynx_pagetype - категория (тип) страницы:
- home - главная страница;
- searchresults - страница с результатами поиска по сайту;
- offerdetail - страница с информацией о товаре;
- conversionintent - страница корзины или страница оформления заказа;
- conversion - страница подтверждения оформления заказа;
- other - все остальные страницы.
dynx_totalvalue - стоимость товара (или товаров, для корзины и страниц оформления и подтверждения заказа). Если в корзину добавлены 2 товара, то цены перечисляются в формате:
?
1 | dynx_totalvalue: [969, 1607],
|
Пример кодов для каждого их типов страниц. Главная:
?
1 2 3 | dynx_itemid: '',
dynx_pagetype: 'home',
dynx_totalvalue:
|
Страница результатов поиска:
?
1 2 3 | dynx_itemid: '',
dynx_pagetype: ' searchresults',
dynx_totalvalue:
|
Страница товара:
?
1 2 3 | dynx_itemid: '114247',
dynx_pagetype: 'offerdetail',
dynx_totalvalue: 969,
|
Страница корзины и оформления заказа:
?
1 2 3 | dynx_itemid: [‘114247’, ‘128713’],
dynx_pagetype: 'conversionintent',
dynx_totalvalue: [969, 1607],
|
Страница завершенной покупки:
?
1 2 3 | dynx_itemid: [‘114247’, ‘128713’],
dynx_pagetype: 'conversion',
dynx_totalvalue: [969, 1607],
|
Прочие страницы сайта:
?
1 2 3 | dynx_itemid: '',
dynx_pagetype: 'other',
dynx_totalvalue:
|
Реализация.
Открываем файл header.php и в нем, в секции head, прописываем вызов отложенной функции, которая будет в дальнейшем выводить нужный код:
?
1 2 | echo $APPLICATION->AddBufferContent(array('SeoClass', 'DinXDataLayer')); // если функция указана в классе SeoClass или
echo $APPLICATION->AddBufferContent('DinXDataLayer'); // если функция лежит просто, например, в init.php, или тут же, в header.pgp
|
Сама функция имеет вид:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | function DinXDataLayer(){
global $APPLICATION;
$pageProperty = $APPLICATION->GetPageProperty('pagetype');
$itemID = $APPLICATION->GetPageProperty('product_id');
$productsTotal = $APPLICATION->GetPageProperty('total_value');
switch ($pageProperty){
case 'home':
$dinX = array(
'dynx_itemid'=>'',
'dynx_pagetype'=>'home',
'dynx_totalvalue'=>''
); break;
case 'search':
$dinX = array(
'dynx_itemid'=>'',
'dynx_pagetype'=>'searchresults',
'dynx_totalvalue'=>''
); break;
case 'product':
$dinX = array(
'dynx_itemid'=>$itemID,
'dynx_pagetype'=>'offerdetail',
'dynx_totalvalue'=>$productsTotal
); break;
case 'order':
case 'basket':
$dinX = array(
'dynx_itemid'=>$itemID,
'dynx_pagetype'=>'conversionintent',
'dynx_totalvalue'=>$productsTotal
); break;
case 'confirm':
$dinX = array(
'dynx_itemid'=>$itemID,
'dynx_pagetype'=>'conversion',
'dynx_totalvalue'=>$productsTotal
); break;
default:
$dinX = array(
'dynx_itemid'=>'',
'dynx_pagetype'=>'other',
'dynx_totalvalue'=>''
); break;
}
return '<script data-skip-moving="true">'
.'window.dataLayer = window.dataLayer || [];'
.'dataLayer.push('.\Bitrix\Main\Web\Json::encode($dinX).');'
.'</script>';
}
|
Таким образом, на основании переданной в свойства страниц информации, будет отображаться соответствующий код.
Для главной страницы задаем свойство:
?
1 | $APPLICATION->SetPageProperty('pagetype','home');
|
Для страницы с результатами поиска задаем:
?
1 | $APPLICATION->SetPageProperty('pagetype','search');
|
Для страницы с корзиной, внутри компонента корзины, в файле result_modifier.php прописываем:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | if(!empty($arResult['ITEMS']['AnDelCanBuy'])){
$arResult['JSON_DATA'] = array(
'product_id'=>array(),
'total_value'=>array()
);
foreach ($arResult['ITEMS']['AnDelCanBuy'] as $arItem)
{
if(!in_array($arItem['PRODUCT_ID'],$arResult['JSON_DATA']['product_id'])){
$arResult['JSON_DATA']['product_id'][] = $arItem['PRODUCT_ID'].'';
$arResult['JSON_DATA']['total_value'][] = floatval($arItem['PRICE']);
}
}
}
$this->__component->arResultCacheKeys = array_merge($this->__component->arResultCacheKeys, array('JSON_DATA'));
|
Далее, в файле component_epilog пишем:
?
1 2 3 4 5 | if(!empty($arResult['JSON_DATA'])){
$APPLICATION->SetPageProperty('pagetype','basket');
$APPLICATION->SetPageProperty('product_id',implode(',',$arResult['JSON_DATA']['product_id']));
$APPLICATION->SetPageProperty('total_value',implode(',',$arResult['JSON_DATA']['total_value']));
}
|
Таким образом, информация для страницы корзины будет выведена только в том случае, если корзина не пустая.
Для страницы оформления заказа, в файлe result_modifier.php шаблона компонента оформления заказа, пишем:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | if (!empty($arResult["ORDER"]))
{
// для уже оформленного заказа, получаем корзину из заказа:
$order = Sale\Order::load($arResult['ORDER']['ID']);
$basket = $order->getBasket();
} else {
// если заказ еще не оформлен - получаем текущую корзину пользователя:
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite());
}
$basketItems = $basket->getBasketItems();
foreach ($basketItems as $basketItem)
{
$basketItemID = $basketItem->getId();
$arBasketItems[$basketItemID] = array(
'ID' => $basketItemID,
'PRODUCT_ID' => $basketItem->getProductId(),
'PRICE' => $basketItem->getPrice()
);
}
if(!empty($arBasketItems)){
$arResult['JSON_DATA'] = array(
'product_id'=>array(),
'total_value'=>array()
);
foreach ($arBasketItems as $arItem)
{
if(!in_array($arItem['PRODUCT_ID'],$arResult['JSON_DATA']['product_id'])){
$arResult['JSON_DATA']['product_id'][] = $arItem['PRODUCT_ID'].'';
$arResult['JSON_DATA']['total_value'][] = floatval($arItem['PRICE']);
}
}
}
$this->__component->arResultCacheKeys = array_merge($this->__component->arResultCacheKeys, array('JSON_DATA'));
|
Далее, в шаблоне, прописываем для страницы с выводом информации о том, что заказ принят:
?
1 2 3 4 5 | if(!empty($arResult['JSON_DATA'])){
$APPLICATION->SetPageProperty('pagetype','confirm');
$APPLICATION->SetPageProperty('product_id',implode(',',$arResult['JSON_DATA']['product_id']));
$APPLICATION->SetPageProperty('total_value',implode(',',$arResult['JSON_DATA']['total_value']));
}
|
Для остальных страниц:
?
1 2 3 4 5 | if(!empty($arResult['JSON_DATA'])){
$APPLICATION->SetPageProperty('pagetype','order');
$APPLICATION->SetPageProperty('product_id',implode(',',$arResult['JSON_DATA']['product_id']));
$APPLICATION->SetPageProperty('total_value',implode(',',$arResult['JSON_DATA']['total_value']));
}
|
Для страницы карточки товара, в файле result_modifier.php компонента карточки товара, добавляем минимальную цену в ключи кеширования, чтобы получить к данному полю информацию в файле component_epilog.php:
?
1 2 | $this->__component->arResultCacheKeys = array_merge(
$this->__component->arResultCacheKeys, array('MIN_PRICE'));
|
А в файле component_epilog.php пишем:
?
1 2 3 4 5 | if(!empty($arResult['MIN_PRICE'])){
$APPLICATION->SetPageProperty('pagetype','product');
$APPLICATION->SetPageProperty('product_id',$arResult['ID']);
$APPLICATION->SetPageProperty('total_value',$arResult['MIN_PRICE']['DISCOUNT_VALUE']);
}
|
Для всех остальных страниц будет показана информация для страницы типа "другая".