Хиты продаж — это товары, которые пользуются наибольшим спросом у покупателей. Их выделение на сайте повышает доверие клиентов и увеличивает конверсию. Однако ручное обновление списка хитов требует времени и может быть необъективным.
В этой статье мы разберем готовый PHP-скрипт для Битрикс, который:
-
Автоматически собирает данные о продажах.
-
Определяет самые популярные товары.
-
Помечает их как хиты и сбрасывает устаревшие метки.
1. Сбор данных о заказах
Для начала получим список заказов за последние 30 дней:
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");
CModule::IncludeModule("sale");
$IBLOCK_ID = 3; // ID инфоблока с товарами
// Получаем заказы за последний месяц
$monthAgo = time() - 3600 * 24 * 30;
$arFilter = [
">=DATE_INSERT" => date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), $monthAgo)
];
$dbOrders = CSaleOrder::GetList(
["DATE_INSERT" => "ASC"],
$arFilter,
false,
false,
["ID"]
);
$orderIds = [];
while ($order = $dbOrders->Fetch()) {
$orderIds[] = $order['ID'];
}Оптимизация:
-
Если заказов много, используйте пагинацию или выбирайте данные порциями.
-
Можно добавить фильтр по статусу заказов (например, только оплаченные).
2. Анализ корзин и подсчет продаж
Теперь определим, какие товары встречаются в заказах чаще всего:
$productSales = [];
foreach ($orderIds as $orderId) {
$dbBasketItems = CSaleBasket::GetList(
[],
["ORDER_ID" => $orderId],
false,
false,
["PRODUCT_ID", "PRICE", "QUANTITY"]
);
while ($item = $dbBasketItems->Fetch()) {
$productId = $item['PRODUCT_ID'];
$productSales[$productId]['count'] = ($productSales[$productId]['count'] ?? 0) + 1;
$productSales[$productId]['sum'] = ($productSales[$productId]['sum'] ?? 0) + $item['PRICE'] * $item['QUANTITY'];
}
}Улучшение:
-
Учитываем не только количество покупок, но и общую выручку.
-
Можно добавить проверку на дублирование товаров в одном заказе.
3. Определение хитов
Хитом будем считать товар, который:
-
Купили 4+ раза ИЛИ
-
Общая сумма продаж превышает 50 000 руб.
$hitProducts = [];
foreach ($productSales as $productId => $data) {
if ($data['count'] >= 4 || $data['sum'] > 50000) {
$hitProducts[] = $productId;
}
}
// Помечаем товары как хиты
foreach ($hitProducts as $productId) {
CIBlockElement::SetPropertyValuesEx(
$productId,
$IBLOCK_ID,
["HIT" => "Y"] // "Y" — значение свойства "Хит"
);
}4. Сброс устаревших хитов
Чтобы список оставался актуальным, снимаем метку с товаров, которые больше не соответствуют критериям:
$res = CIBlockElement::GetList(
["ID" => "ASC"],
[
"IBLOCK_ID" => $IBLOCK_ID,
"ACTIVE" => "Y",
"PROPERTY_HIT_VALUE" => "Y" // Только товары, помеченные как хиты
],
false,
false,
["ID"]
);
while ($item = $res->GetNext()) {
if (!in_array($item['ID'], $hitProducts)) {
CIBlockElement::SetPropertyValuesEx(
$item['ID'],
$IBLOCK_ID,
["HIT" => false] // Снимаем метку
);
}
}5. Автоматизация через агентов
Чтобы скрипт запускался автоматически, добавим его в агенты Битрикс:
// Функция-обертка для агента
function updateHitProducts() {
// Весь код скрипта здесь
return "updateHitProducts();";
}
// Регистрация агента (выполняется один раз)
CAgent::AddAgent(
"updateHitProducts();",
"",
"N",
86400 // Запуск раз в сутки
);Дополнительные улучшения
-
Фильтр по категориям
Можно анализировать хиты только в определенных разделах:$arFilter["SECTION_ID"] = [10, 15]; // ID нужных разделов
-
Логирование изменений
Запись в файл для отслеживания работы скрипта:file_put_contents( $_SERVER["DOCUMENT_ROOT"] . "/hit_updates.log", date("Y-m-d H:i:s") . " Товар ID {$productId} помечен как хит\n", FILE_APPEND );
-
Учет сезонности
Можно менять период анализа (например, зимой — 60 дней, летом — 30).
Заключение
Этот скрипт позволяет автоматизировать процесс выявления хитов продаж, экономя время маркетологов и повышая эффективность интернет-магазина. Доработав его под свои нужды, вы сможете гибко управлять ассортиментом и увеличивать продажи.
Рекомендации:
-
Протестируйте скрипт на тестовой копии сайта.
-
Настройте периодичность запуска в зависимости от нагрузки.
-
Добавьте уведомления об ошибках (например, если свойство "HIT" не найдено).