1С-Битрикс

1С-Битрикс является одним из самых распространенных решениий ECP на российском рынке. Мы рекомендуем попробовать установить тэги через плагин Criteo OneTag перед тем, как попытаться это сделать вручную. Данное руководство поможет вам с установкой и отладкой тэгов Criteo в среде 1С-Битрикс, а также расскажет вам о том, как правильно экспортировать каталог продуктов в формате, соответствующем спецификации Criteo.

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

[[disclaimer-nonplugin]]

Обзор

  1. Генерация фида
  2. Тэг домашней страницы
  3. Тэг листинга
  4. Тэг продукта
  5. Тэг корзины
  6. Тэг продажи
  7. Правильность установки
  8. Заключение

Что нам нужно в первую очередь

  • Нам понадобится доступ в личный кабинет Integrate.
  • FTP, SSH или доступ к административному интерфейсу сервера, на котором установлено окружение 1С-Битрикс.
  • Инструмент для проверки тэгов Accurate.

Для ясности в данном руководстве мы будем производить установку тэгов через файловый редактор 1С-Битрикс.

Шаг 1. Генерация фида

Простейший способ экспортировать фид в данной ECP - с помощью встроенного генератора фида (Шаги 1.A - 1.C) Шаги 1.E и 1.D покажут вам как установить регулярный экспорт фида.

A) Нажимаем на кнопку "Меню" админки, затем выбираем Экспорт данных, как это показано на рисунке ниже. Яндекс фид

B) Выбираем Формат - Yandex, жмем кнопку "Экспортировать". Экспорт фида

Не забудьте установить расписание экспорта:

Установка расписания

Вы получите на выходе строчку с нужной командой. Сохраните ее для шага 1.D.

C) Теперь выбираем тот блок продуктов, на который мы собираемся настраивать ретаргетинг. В данном случае это весь инфоблок "Одежда". Выбираем нужные каталоги, как это показано на следующем рисунке:

Экспорт инфоблока

Не забудьте указать полный URL вашего сайта в поле "Доменное имя", и имя файла экспорта. В вашем случае это {{homepageurl}}. Фид, соответственно, будет доступен по адресу {{homepageurl}}/bitrix/catalog_export/yandex_893471.php.

D) Залогиньтесь с помощью SSH в терминал вашего сервера. Установить экспорт каталога товаров можно с помощью утииты cron:

crontab -e

Добавляем в конец следующую строчку (реальное значение взять на шага 1.B):

 0 4 * * * /usr/bin/php -f /var/www/www-root/data/www/shop.com/bitrix/php_interface/include/catalog_export/cron_frame.php 5 >/var/www/www-root/data/www/shop.com/bitrix/php_interface/include/catalog_export/logs/5.txt

Сохраняем и закрываем.

E) Файл /var/www/www-root/data/www/shop.com/bitrix/php_interface/include/catalog_export/cron_frame.php будет создан автоматически.

Вам нужно будет отредактировать его, установив правильное значение переменных $_SERVER["DOCUMENT_ROOT"] иsiteID

В нашем случае это:

  $_SERVER["DOCUMENT_ROOT"] = "/var/www/www-root/data/www/shop.com";
  $siteID = 's1'; // значение можно посмотреть в настройках

Поделитесь ссылкой на фид с вашим менеджером Criteo.

Шаг 2. Тэг домашней страницы

Данный тэг регистрирует визит пользователя на ваш сайт. Ставится этот тип тэга на страницы, не содержащие динамического контента. Детали тэга домашней страницы вы можете узнать здесь.

Шаблон, который использует наш магазин называется eshop_bootstrap_green, в него мы установим тэг домашней странички. Открываем папку \bitrix\templates\eshop_bootstrap_green и редактируем header.php:

Homepage tag

Коды для вставки приведен ниже:

<? 
    $criteoHomePageTags = array(SITE_DIR."index.php", SITE_DIR."about/delivery/index.php",SITE_DIR."about/guaranty/index.php", SITE_DIR."about/contacts/index.php",SITE_DIR."about/index.php", SITE_DIR."news/index.php",SITE_DIR."about/howto/index.php");

if (in_array($curPage,$criteoHomePageTags)):?>
<script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>
<script>
window.criteo_q = window.criteo_q || [];
var deviceType = /iPad/.test(navigator.userAgent)?"t":/webOS|Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent)?"m":"d";
window.criteo_q.push(
    { event: "setAccount", account: {{accountid}} },
    { event: "setEmail", email: "<?=$USER->GetEmail();?>" },
    { event: "setSiteType", type: deviceType },
    { event: "viewHome", ecpplugin: "1cbitrix" });
</script>

<?endif?>

Обратите внимание на первую строчку кода. В данном примере мы установили тэг домашней страницы на все статичные страницы, а именно: главная - SITE_DIR."index.php", контакты - SITE_DIR."about/contacts/index.php", о компании - SITE_DIR."about/index.php" и т.д

Шаг 3. Тэг листинга

Тэг листинга передает сообщение о просмотре потенциальным клиентом каталога продуктов на сервер Критео. Более подробно о формате тэга продукта можно прочитать здесь.

Тэг листинга мы встраиваем не в шаблон магазина, а в системный компонент 1С-Битрикс, который называется catalog.section. При изменении темы или дизайна логика работы тэгов останется неизменной. Шаблон компонента можно найти по адресу \bitrix\components\bitrix\catalog.section\templates\list\template.php.

Следующий код нужно встроить в самый конец файла:

foreach ($arResult['ITEMS'] as $key => $arItem)
{
    $id = $arItem['ID'];
    $productOffers = CCatalogSKU::getOffersList($id);
    $producIdArray = reset($productOffers[$id]);
    $productIds[] = $producIdArray["ID"];
}

$js_array = json_encode(array_slice($productIds, 0, 3)); ?>
<script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
window.criteo_q.push(
        { event: "setAccount", account: {{accountid}} },
        { event: "setEmail", email: "<? echo $USER->GetEmail(); ?>"},
        { event: "setSiteType", type: deviceType },
        { event: "viewList", ecpplugin: "1cbitrix", item: <? echo $js_array; ?> }
);
</script>

В данном коде мы используем переменную arResult, которая служит источником данных для компонента каталога. В этом компоненте предоставлены ID продукта. Также мы использовали API функцию CCatalogSKU::getOffersList. Данная функция возвращает список товарных предложений по ID продукта.

Шаг 4. Продуктовый тэг

Визит на страничку товара регистрируется продуктовым тэгом. Продуктовый тэг играет большую роль в улучшении модели данных и его установка помогает Criteo Engine установить правильный контекст пользователя, находящегося на вашем сайте. Для установки тэга продукта отредактируем компонент catalog.element. Найдите
файл www\bitrix\components\bitrix\catalog.element\templates\.default\template.php и вставьте следующий код:

<?
$ID = $arResult['ID'];
$IBLOCK_ID = $arParams["IBLOCK_ID"];
$arInfo = CCatalogSKU::GetInfoByProductIBlock($IBLOCK_ID);
if (is_array($arInfo)) {
    $rsOffers = CIBlockElement::GetList(array(),array('IBLOCK_ID' => $arInfo['IBLOCK_ID'], 'PROPERTY_'.$arInfo['SKU_PROPERTY_ID'] => $ID));
    while ($arOffer = $rsOffers->GetNext()) {
        $itemId[] = $arOffer['ID'];
    }
}; ?>
<script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
var deviceType = /iPad/.test(navigator.userAgent)?"t":/webOS|Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent)?"m":"d";
window.criteo_q = window.criteo_q || [];
window.criteo_q.push(
    { event: "setAccount", account: {{accountid}} },
    { event: "setEmail", email: "<?=$USER->GetEmail();?>" },
    { event: "setSiteType", type: deviceType },
    { event: "viewItem", ecpplugin: "1cbitrix", item: "<? echo $itemId[0]; ?>" }
);
</script>

В данном примере мы установили тэг на шаблон по умолчанию .default. Тэг нужно установить на все шаблоны компонента catalog.element, которые лежат в папке templates.

Шаг 5. Тэг корзины

Тэг корзины особенно важен тем,что содержит товары, которые пользователи намереваются купить. Эффективное решение маркетинговых задач без верного внедрения данного тэга будет затруднительно. Открываем компонент корзины \bitrix\components\bitrix\sale.basket.basket\templates\.default\template.php и вставляем следующий код:

<?
$arID = array();
$arBasketItems = array();
$dbBasketItems = CSaleBasket::GetList(
    array(
        "NAME" => "ASC",
        "ID" => "ASC"
    ),
    array(
        "FUSER_ID" => CSaleBasket::GetBasketUserID(),
        "LID" => SITE_ID,
        "ORDER_ID" => "NULL"
    ),
    false,
    false,
    array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "PRODUCT_PROVIDER_CLASS")
);
while ($arItems = $dbBasketItems->Fetch())
{
    if ('' != $arItems['PRODUCT_PROVIDER_CLASS'] || '' != $arItems["CALLBACK_FUNC"])
    {
        CSaleBasket::UpdatePrice($arItems["ID"],
            $arItems["CALLBACK_FUNC"],
            $arItems["MODULE"],
            $arItems["PRODUCT_ID"],
            $arItems["QUANTITY"],
            "N",
            $arItems["PRODUCT_PROVIDER_CLASS"]
        );
        $arID[] = $arItems["ID"];
    }
}

if (!empty($arID))
{
    $dbBasketItems = CSaleBasket::GetList(
        array(
            "NAME" => "ASC",
            "ID" => "ASC"
        ),
        array(
            "ID" => $arID,
            "ORDER_ID" => "NULL"
        ),
        false,
        false,
        array("PRODUCT_ID", "QUANTITY", "PRICE")
    );
    while ($arItems = $dbBasketItems->Fetch())
    {
        $newArItems["id"] = $arItems["PRODUCT_ID"];
        $newArItems["quantity"] = $arItems["QUANTITY"];
        $newArItems["price"] = floatval($arItems["PRICE"]);
        $arBasketItems[] = $newArItems;
    }
}
$js_array = json_encode($arBasketItems); ?>
<script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
window.criteo_q.push(
    { event: "setAccount", account: {{accountid}} },
    { event: "setEmail", email: "<? echo $USER->GetEmail(); ?>" },
    { event: "setSiteType", type: deviceType },
    { event: "viewBasket", ecpplugin: "1cbitrix", item: <? echo $js_array; ?> }
);
</script>

Шаг 6. Тэг продажи

Конечная точка на пути клиента - покупка. Тэг продаж играет большую роль в механизме обратной связи Criteo Engine, поэтому важно передавать все исходящие с сайта транзакции и придерживаться формата тэга, описанного в документации .

Изучив описание тэга продаж, переходим по следующему адресу: \bitrix\components\bitrix\sale.order.ajax\templates\.default\confirm.php и добавляем код:

<?
if (!empty($arResult["ORDER"]) && !empty($arResult["PAYMENT"])) {
$transactionId = $arResult["ORDER"]["ID"];
CModule::IncludeModule('sale');
$res = CSaleBasket::GetList(array(), array("ORDER_ID" => $arResult["ORDER"]["ID"])); // ID заказа
while ($arItem = $res->Fetch()) {
    $newArItems["id"] = $arItem["PRODUCT_ID"];
    $newArItems["price"] = floatval($arItem["PRICE"]);
    $newArItems["quantity"] = $arItem["QUANTITY"];
    $arBasketItems[] = $newArItems;
}
$js_array = json_encode($arBasketItems);  ?>
<script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
window.criteo_q.push(
    { event: "setAccount", account: {{accountid}} },
    { event: "setEmail", email: "<? echo $USER->GetEmail(); ?>" },
    { event: "setSiteType", type: deviceType },
    { event: "trackTransaction", ecpplugin: "1cbitrix", id: <? echo $transactionId; ?>, item: <? echo $js_array; ?> }
);
</script> 

<? }; ?>

Успешная продажа перенаправит вас на страницу благодарности.

Из знакомой уже нам переменной arResult мы получаем ID заказа, который передается в функцию GetList. Согласно документации 1C-Битрикс метод CSaleBasket::GetList возвращает результат выборки записей из корзины в соответствии со своими параметрами. Здесь же включаем модуль sale который отвечает за функции связанные с транзакциями.

Проверяем правильность установки

[[accurate_ru]]

Заключение

Только что мы сгенерировали фид и прошли через установку необходимых тэгов на примере демонстрационного магазина одежды. Тэги и товарный каталог являются важнейшими источниками информации для модуля рекомендации Criteo Engine, который получает от 30000 запросов в секунду и принимает решения в реальном времени. Если у вас возникли трудности на любом из этапов интеграции, то сообщите об этом нам на почту. Мы обязательно поможем вам с устранением возникшей проблемы.