WooCommerce: использование хука woocommerce_before_cart для добавления товара в корзину по формуле

Что такое хук woocommerce_before_cart и зачем он нужен

Хук woocommerce_before_cart запускается на странице корзины WooCommerce перед выводом списка товаров. Это удобное место для внедрения дополнительной логики, например, динамического добавления товаров в корзину на основе текущих данных корзины или других внешних факторов.

В реальных задачах часто требуется автоматически добавлять в корзину сопутствующие товары или промо-позиции, если в корзине есть определённые товары или сумма заказа превышает заданное значение. Это позволяет увеличить средний чек и улучшить UX без вмешательства пользователя.

Диагностика задачи: как понять, что нужно добавлять товар программно

  • Проверить бизнес-логику: например, при сумме корзины более 5000 руб автоматически добавить подарок.
  • Выяснить, что стандартных настроек WooCommerce и плагинов недостаточно для реализации.
  • Проверить, что добавление товара вручную неудобно для клиента.

Пошаговое решение: добавление товара в корзину через хук woocommerce_before_cart

Реализуем добавление товара с ID = 123 (например, подарок) при условии, что сумма корзины превышает 5000 руб и подарок ещё не в корзине.

add_action('woocommerce_before_cart', 'add_gift_product_if_cart_total_exceeds_threshold');
function add_gift_product_if_cart_total_exceeds_threshold() {
    if ( is_admin() ) return; // не выполняем в админке

    $gift_product_id = 123; // ID товара-подарка
    $threshold = 5000; // порог по сумме

    // Проверяем, есть ли товар в корзине
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( $cart_item['product_id'] == $gift_product_id ) {
            return; // товар уже в корзине
        }
    }

    // Проверяем сумму корзины
    if ( WC()->cart->subtotal > $threshold ) {
        WC()->cart->add_to_cart( $gift_product_id );
        wc_add_notice( 'Поздравляем! Подарок добавлен в вашу корзину.', 'success' );
    }
}

Обратите внимание, что мы используем WC()->cart->subtotal без учета налогов и скидок — при необходимости можно заменить на get_cart_contents_total() или рассчитывать по-своему.

Как добавить проверку по конкретному товару в корзине

Если условие — наличие определенного товара (например, товар с ID 10), добавим проверку:

function add_gift_if_product_in_cart() {
    $gift_product_id = 123;
    $required_product_id = 10;

    $has_required_product = false;
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( $cart_item['product_id'] == $required_product_id ) {
            $has_required_product = true;
            break;
        }
    }

    if ( ! $has_required_product ) return;

    // Проверяем, что подарок не добавлен
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( $cart_item['product_id'] == $gift_product_id ) {
            return;
        }
    }

    WC()->cart->add_to_cart( $gift_product_id );
    wc_add_notice( 'Добавлен подарок за покупку товара №10', 'success' );
}
add_action('woocommerce_before_cart', 'add_gift_if_product_in_cart');

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

  • Откройте страницу корзины при пустой корзине — подарок не добавится.
  • Добавьте товар с ID 10 или увеличьте сумму корзины выше 5000 руб — подарок должен появиться автоматически.
  • Проверьте, что подарок добавляется один раз, без дублирования.
  • Обратите внимание на сообщения вверху страницы, они должны отображать уведомления об успешном добавлении.
  • При повторном обновлении страницы подарок не должен дублироваться.

Частые ошибки и как исправить

  • Подарок добавляется много раз: не было проверки на существование товара в корзине. Решение — всегда проверяйте, не лежит ли товар уже в корзине перед добавлением.
  • Подарок не добавляется: возможно, условие проверки суммы написано с ошибкой, либо хук подключен в неправильном месте.
  • Подарок появляется, но не отображается в корзине: возможно, кэширование страниц мешает обновлению. Очистите кэш сайта и браузера.
  • Подарок добавляется, но цена не равна 0: если нужно сделать подарок бесплатным, дополнительно настройте цену товара или примените скидку через хук woocommerce_before_calculate_totals.

Практические советы по безопасности и производительности

  • Не вызывайте функции добавления товаров в корзину в админке — проверяйте is_admin().
  • Минимизируйте количество циклов по корзине — используйте флаги для выхода из цикла сразу после нахождения нужного товара.
  • Для сложных условий используйте transient-кэширование, чтобы не нагружать сервер постоянными проверками.
  • При работе с большими магазинами учитывайте влияние автоматического добавления товаров на UX и нагрузку на сервер.

Сравнение вариантов реализации автоматического добавления товаров в корзину

ВариантПлюсыМинусы
Использование хука woocommerce_before_cartПростота, быстрое внедрение, работает на странице корзиныДобавление происходит только при посещении корзины, не всегда удобно
Использование template_redirect для добавления товараМожно добавить товар в корзину на любой страницеСложнее контролировать логику, возможны конфликты
Плагины для сопутствующих товаровГотовые функции, UI для настройкиМогут быть тяжеловесными, не всегда гибкие
WooCommerce: использование хука woocommerce_order_status_changed для автоматической отправки отзывов
13.07.2026
Как создать динамическую таблицу в WordPress с помощью шорткода
30.12.2025
Автоматическое удаление заказов со статусом "возврат" в WooCommerce
01.08.2026
Как удалить метаданные из изображений в WordPress без плагинов
09.12.2025
Как добавить автоматическое оптимизирование изображений в WordPress
18.11.2025