Введение в 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; // Разные варианты для мобильных и десктоповПрактические советы
-
Длительность теста: Устанавливайте куки на период, достаточный для сбора значимых данных (обычно 2-4 недели)
-
Чистота эксперимента: Исключите влияние администраторов:
if ($USER->IsAdmin()) { $variant = 0; // Админы всегда видят оригинал }
-
Грамотное завершение: После окончания теста:
-
Сохраните результаты
-
Удалите служебные куки
-
Оставьте выигравший вариант
-
-
Визуальное выделение: В режиме разработки можно пометить варианты:
if ($_SERVER['REMOTE_ADDR'] == 'ваш_IP') { echo '<style>body { border-top: 5px solid #'.($variant == 0 ? 'ff0000' : '00ff00').' }</style>'; }
Заключение
Реализованное решение позволяет гибко проводить A/B-тестирование без дополнительных затрат. Вы можете расширять его функционал по мере необходимости, добавляя новые параметры тестирования, системы аналитики и сегментацию аудитории.
Для больших проектов с интенсивным тестированием стоит рассмотреть специализированные системы, но для большинства задач этого решения будет достаточно. Главное — четко формулировать гипотезы перед тестированием и корректно интерпретировать результаты.