Для настройки кода динамического ремаркетинга на сайте должен срабатывать следующий скрипт:
<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']); }
Для всех остальных страниц будет показана информация для страницы типа "другая".
Разработка сайта
Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...
Сопровождение сайта
Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение
Работы по сайту
Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.