Добавление скрипта для динамического ремаркетинга на сайт с 1С-Битрикс

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

<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 товара, то идентификаторы перечисляются в формате: 

dynx_itemid: [‘114247’, ‘128713’],

dynx_pagetype - категория (тип) страницы:

  • home - главная страница; 
  • searchresults - страница с результатами поиска по сайту; 
  • offerdetail - страница с информацией о товаре; 
  • conversionintent - страница корзины или страница оформления заказа; 
  • conversion - страница подтверждения оформления заказа; 
  • other - все остальные страницы.

dynx_totalvalue - стоимость товара (или товаров, для корзины и страниц оформления и подтверждения заказа). Если в корзину добавлены 2 товара, то цены перечисляются в формате: 

dynx_totalvalue: [969, 1607],

Пример кодов для каждого их типов страниц. Главная:

dynx_itemid: '',
dynx_pagetype: 'home',
dynx_totalvalue:

Страница результатов поиска:

dynx_itemid: '',
dynx_pagetype: ' searchresults',
dynx_totalvalue:

Страница товара:

dynx_itemid: '114247',
dynx_pagetype: 'offerdetail',
dynx_totalvalue: 969,

Страница корзины и оформления заказа:

dynx_itemid: [‘114247’, ‘128713’],
dynx_pagetype: 'conversionintent',
dynx_totalvalue: [969, 1607],

Страница завершенной покупки:

dynx_itemid: [‘114247’, ‘128713’],
dynx_pagetype: 'conversion',
dynx_totalvalue: [969, 1607],

Прочие страницы сайта:

dynx_itemid: '',
dynx_pagetype: 'other',
dynx_totalvalue:

Реализация.

Открываем файл header.php и в нем, в секции head, прописываем вызов отложенной функции, которая будет в дальнейшем выводить нужный код:

echo $APPLICATION->AddBufferContent(array('SeoClass', 'DinXDataLayer')); // если функция указана в классе SeoClass или
echo $APPLICATION->AddBufferContent('DinXDataLayer'); // если функция лежит просто, например, в init.php, или тут же, в header.pgp

Сама функция имеет вид:

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>';
}

Таким образом, на основании переданной в свойства страниц информации, будет отображаться соответствующий код.

Для главной страницы задаем свойство:

$APPLICATION->SetPageProperty('pagetype','home');

Для страницы с результатами поиска задаем:

$APPLICATION->SetPageProperty('pagetype','search');

Для страницы с корзиной, внутри компонента корзины, в файле result_modifier.php прописываем:

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 пишем:

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 шаблона компонента оформления заказа, пишем:

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'));

Далее, в шаблоне, прописываем для страницы с выводом информации о том, что заказ принят:

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']));
}

Для остальных страниц:

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:

$this->__component->arResultCacheKeys = array_merge(
	$this->__component->arResultCacheKeys, array('MIN_PRICE'));

А в файле component_epilog.php пишем:

if(!empty($arResult['MIN_PRICE'])){
	$APPLICATION->SetPageProperty('pagetype','product');
	$APPLICATION->SetPageProperty('product_id',$arResult['ID']);
	$APPLICATION->SetPageProperty('total_value',$arResult['MIN_PRICE']['DISCOUNT_VALUE']);
}

Для всех остальных страниц будет показана информация для страницы типа "другая".

Количество показов: 7872
04.12.2017

Возврат к списку

Если вам была полезна статья можете отблагодарить автора:
Ethereum:

0x16Df809287333C49D3A237296C6248A6c08702Bc

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.