Что такое хук 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 для настройки | Могут быть тяжеловесными, не всегда гибкие |