Главная » Интернет-магазин » Каталог » Избранное (wishlist) в Битрикс

Избранное (wishlist) в Битрикс

Схема реализации избранного (wishlist) через собственную таблицу D7 в 1С-Битрикс

Список избранных товаров (wishlist) — функция, повышающая вовлечённость и дающая покупателю способ вернуться к отложенным товарам позже, будь то через месяц или через год. Разберём, как реализовать избранное в 1С-Битрикс для авторизованных и анонимных пользователей.

Хранение для авторизованного пользователя

Для авторизованных пользователей избранное логично хранить привязанным к учётной записи — либо через отдельный инфоблок с элементами-связками "пользователь — товар", либо через собственную таблицу D7 с полями USER_ID и PRODUCT_ID. Табличный вариант через DataManager обычно эффективнее инфоблока для такой простой структуры данных без необходимости в сложных свойствах и административном интерфейсе редактирования, свойственном инфоблокам.

<?php

namespace Vendor\Module;

use Bitrix\Main\Entity\DataManager;
use Bitrix\Main\Entity\IntegerField;
use Bitrix\Main\Entity\DatetimeField;

class WishlistTable extends DataManager
{
    public static function getTableName(): string
    {
        return 'vendor_wishlist';
    }

    public static function getMap(): array
    {
        return [
            new IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
            new IntegerField('USER_ID', ['required' => true]),
            new IntegerField('PRODUCT_ID', ['required' => true]),
            new DatetimeField('ADDED_AT'),
        ];
    }
}

Добавление и удаление товара

<?php

use Bitrix\Main\Type\DateTime;

function toggleWishlist(int $userId, int $productId): bool
{
    $existing = WishlistTable::getList([
        'filter' => ['USER_ID' => $userId, 'PRODUCT_ID' => $productId],
        'select' => ['ID'],
    ])->fetch();

    if ($existing) {
        WishlistTable::delete($existing['ID']);
        return false; // удалено из избранного
    }

    WishlistTable::add([
        'USER_ID' => $userId,
        'PRODUCT_ID' => $productId,
        'ADDED_AT' => new DateTime(),
    ]);

    return true; // добавлено в избранное
}

Функция-переключатель (toggle) упрощает логику кнопки "в избранное" — один вызов сам определяет, добавить товар или убрать, в зависимости от текущего состояния, что удобнее для AJAX-обработчика кнопки, чем раздельные методы добавления и удаления с проверкой состояния на стороне клиента.

Нужна помощь с Битрикс?





    Избранное для анонимного посетителя

    Для неавторизованных посетителей список избранного логично хранить в cookie или localStorage на стороне браузера — это не требует обращения к серверу для хранения, но означает, что список теряется при смене устройства или очистке данных браузера. Компромиссный вариант — хранить в cookie до авторизации, а при входе синхронизировать локальный список с серверным хранилищем, объединяя оба набора.

    Слияние избранного при авторизации

    <?php
    
    function mergeWishlistOnLogin(int $userId, array $anonymousProductIds): void
    {
        foreach ($anonymousProductIds as $productId) {
            $existing = WishlistTable::getList([
                'filter' => ['USER_ID' => $userId, 'PRODUCT_ID' => $productId],
            ])->fetch();
    
            if (!$existing) {
                WishlistTable::add(['USER_ID' => $userId, 'PRODUCT_ID' => $productId]);
            }
        }
    }

    При авторизации ранее анонимного посетителя, накопившего список избранного в cookie, стоит объединить его с уже существующим серверным списком пользователя, а не заменять один список другим целиком, — покупатель ожидает увидеть все свои ранее отложенные товары, а не потерять часть из них из-за перезаписи.

    Проверка актуальности товаров в избранном

    Товар, добавленный в избранное давно, может стать неактивным или вовсе быть удалён из каталога к моменту, когда покупатель вернётся посмотреть список, — вывод избранного должен корректно обрабатывать такие случаи (скрывать неактивные товары или показывать пометку "товар больше недоступен"), а не падать с ошибкой при попытке вывести данные несуществующего элемента.

    Уведомления об изменении цены избранных товаров

    Дополнительная функциональность, повышающая ценность избранного для маркетинга, — уведомление пользователя о снижении цены на товар в его списке избранного, реализуемое агентом, сравнивающим текущую цену с ценой на момент добавления и рассылающим письмо при существенном снижении. Это требует сохранения цены на момент добавления в структуру данных избранного, если такое сравнение предполагается.

    Частые ошибки

    • Список избранного анонимного пользователя теряется при авторизации. Вместо слияния список просто перезаписывается серверным вариантом.
    • Нет обработки неактивных или удалённых товаров в избранном. Ошибка при попытке вывести данные несуществующего элемента.
    • Отдельная таблица не создана, используется тяжеловесный инфоблок для простой связки. Избыточная сложность для структуры данных, не требующей возможностей инфоблока.

    Итог

    Избранное в 1С-Битрикс эффективнее реализовать через собственную D7-таблицу связки пользователя и товара, а не через инфоблок, избыточный для такой простой структуры. Для анонимных посетителей список хранится на клиенте и объединяется с серверным при авторизации — полная замена одного списка другим рискует незаметно потерять часть отложенных пользователем товаров.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    База знаний