Назад

Самописное A/B-тестирование в Битрикс: полное руководство

Главная
Блог
Самописное A/B-тестирование в Битрикс: полное руководство

Введение в A/B-тестирование

A/B-тестирование — это мощный инструмент для оптимизации конверсии, когда вы сравниваете две или более версии страницы, чтобы определить, какая из них лучше выполняет поставленные задачи. В этой статье я покажу, как реализовать собственное решение для A/B-тестирования в Битрикс без использования дорогостоящих модулей.

Почему самописное решение?

Хотя в Битрикс существуют готовые модули для A/B-тестирования, самописное решение дает вам:

  • Полный контроль над логикой распределения трафика

  • Гибкость в настройке параметров теста

  • Отсутствие дополнительных лицензионных затрат

  • Возможность тонкой настройки под ваши конкретные задачи

Базовый вариант реализации

Вот простой код для старта A/B-тестирования главной страницы:

<?
include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
if (!isset($_COOKIE['AB_TEST_VARIANT'])) {
    CModule::IncludeModule('iblock');
    $IBLOCK_ID = 1; // ID вашего инфоблока
    $ELEMENT_ID = 123; // ID элемента
    // Устанавливаем куку на 1 месяц
    $exp_date = time() + 2628000;
    // По умолчанию вариант 0 (оригинальная версия)
    $variant = 0;
    // Получаем данные из инфоблока
    $res = CIBlockElement::GetList(
        Array("ID" => "ASC"),
        Array("IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y", "ID" => $ELEMENT_ID),
        false,
        false,
        Array('ID', "PROPERTY_AB_TEST_ACTIVE")
    );
    if ($arItem = $res->GetNext()) {
        if ($arItem['PROPERTY_AB_TEST_ACTIVE_VALUE'] == 'Y') {
            // Случайным образом выбираем вариант
            $variant = rand(0, 1) ? 21 : 0; // 50/50 распределение
        }
    }
    setcookie('AB_TEST_VARIANT', $variant, $exp_date, '/');
}
// Перенаправляем на вариант B если нужно
if ($_COOKIE['AB_TEST_VARIANT'] == 21) {
    header("Location: /new-version/", true, 302);
    exit();
}
?>

Улучшенная версия с аналитикой

Давайте расширим функционал, добавив сбор статистики:

<?
// ... предыдущий код до setcookie ...
// Логируем выбор варианта
$statKey = 'ab_test_stats_' . date('Ym');
$stats = unserialize(COption::GetOptionString("main", $statKey, "a:0:{}"));
if (!isset($stats[$variant])) {
    $stats[$variant] = 0;
}
$stats[$variant]++;
COption::SetOptionString("main", $statKey, serialize($stats));
setcookie('AB_TEST_VARIANT', $variant, $exp_date, '/');

Для отображения статистики создайте простой компонент или страницу в админке:

<?
// Вывод статистики
$statKey = 'ab_test_stats_' . date('Ym');
$stats = unserialize(COption::GetOptionString("main", $statKey, "a:0:{}"));
echo "<h2>Статистика A/B теста</h2>";
echo "<table border='1'><tr><th>Вариант</th><th>Просмотры</th></tr>";
foreach ($stats as $variant => $count) {
    echo "<tr><td>".($variant == 0 ? 'Оригинал' : 'Вариант '.$variant)."</td><td>$count</td></tr>";
}
echo "</table>";
?>

Расширенные возможности

1. Поддержка нескольких вариантов

$variants = [
    0 => ['name' => 'Оригинал', 'weight' => 40],
    21 => ['name' => 'Вариант A', 'weight' => 30],
    22 => ['name' => 'Вариант B', 'weight' => 30]
];
$total = array_sum(array_column($variants, 'weight'));
$rand = mt_rand(1, $total);
$current = 0;
foreach ($variants as $id => $variant) {
    $current += $variant['weight'];
    if ($rand <= $current) {
        $selectedVariant = $id;
        break;
    }
}

2. Интеграция с Google Analytics

$APPLICATION->AddHeadString('
<script>
    window.dataLayer = window.dataLayer || [];
    dataLayer.push({
        "event": "abTest",
        "abTestVariant": "'.$_COOKIE['AB_TEST_VARIANT'].'"
    });
</script>
');

3. Сегментация пользователей

// Пример сегментации по типу устройства
$isMobile = preg_match("/(android|iphone|ipod|ipad)/i", $_SERVER['HTTP_USER_AGENT']);
$variant = $isMobile ? 22 : 21; // Разные варианты для мобильных и десктопов

Практические советы

  1. Длительность теста: Устанавливайте куки на период, достаточный для сбора значимых данных (обычно 2-4 недели)

  2. Чистота эксперимента: Исключите влияние администраторов:

    if ($USER->IsAdmin()) {
        $variant = 0; // Админы всегда видят оригинал
    }

  3. Грамотное завершение: После окончания теста:

    • Сохраните результаты

    • Удалите служебные куки

    • Оставьте выигравший вариант

  4. Визуальное выделение: В режиме разработки можно пометить варианты:

    if ($_SERVER['REMOTE_ADDR'] == 'ваш_IP') {
        echo '<style>body { border-top: 5px solid #'.($variant == 0 ? 'ff0000' : '00ff00').' }</style>';
    }

Заключение

Реализованное решение позволяет гибко проводить A/B-тестирование без дополнительных затрат. Вы можете расширять его функционал по мере необходимости, добавляя новые параметры тестирования, системы аналитики и сегментацию аудитории.

Для больших проектов с интенсивным тестированием стоит рассмотреть специализированные системы, но для большинства задач этого решения будет достаточно. Главное — четко формулировать гипотезы перед тестированием и корректно интерпретировать результаты.

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи