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

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

899
04.12.2017

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

<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 - категория (тип) страницы:

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

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



Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

Еще никто не комментировал данную публикацию. Будьте первыми!

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

captcha

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