Как использовать хук WooCommerce add_to_cart для удаления товаров после покупки

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

Иногда требуется автоматически удалять товары из корзины пользователя сразу после оформления заказа. Например, в WooCommerce при продаже цифровых товаров или услуг, которые нельзя купить повторно, чтобы избежать дублирования заказов, или для очистки корзины при нестандартной логике оформления.

По умолчанию WooCommerce очищает корзину после успешного оформления заказа. Однако бывают ситуации, когда корзина не очищается (например, если заказ не прошёл оплату, или пользователь вернулся на сайт и пытается повторить покупку), и требуется дополнительное управление корзиной.

Как работает хук woocommerce_add_to_cart и где его применять

Хук woocommerce_add_to_cart вызывается при добавлении товара в корзину. Однако для задачи очистки корзины после оформления заказа более уместен хук woocommerce_thankyou или woocommerce_checkout_order_processed, который срабатывает после успешного создания заказа.

Но если нужно управлять товаром сразу при добавлении в корзину, например, предотвращать добавление дубликатов или удалять товары при специфических условиях, можно использовать woocommerce_add_to_cart.

Пример: удаление всех товаров из корзины при добавлении нового товара

add_action('woocommerce_add_to_cart', 'clear_cart_before_adding_new_item', 10, 6);
function clear_cart_before_adding_new_item($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
    WC()->cart->empty_cart();
}

Этот код очищает корзину при добавлении любого товара. Важно, что очистка происходит после добавления текущего товара, поэтому корзина в итоге содержит только последний добавленный товар.

Пошаговое решение: удаление товара из корзины после покупки

1. Очистка корзины после успешного оформления заказа

Для этого используем хук woocommerce_thankyou. Он срабатывает после успешной оплаты заказа.

add_action('woocommerce_thankyou', 'clear_cart_after_purchase');
function clear_cart_after_purchase($order_id) {
    if (!is_user_logged_in()) return; // только для залогиненных пользователей

    $order = wc_get_order($order_id);
    if (!$order) return;

    // Очистка корзины
    WC()->cart->empty_cart();
}

2. Удаление конкретного товара из корзины при определенных условиях

Например, если в заказе присутствует товар с ID 123, удалить товар с ID 456 из корзины.

add_action('woocommerce_add_to_cart', 'remove_specific_product_conditionally', 10, 6);
function remove_specific_product_conditionally($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
    if ($product_id == 123) {
        foreach (WC()->cart->get_cart() as $key => $item) {
            if ($item['product_id'] == 456) {
                WC()->cart->remove_cart_item($key);
            }
        }
    }
}

Как проверить, что решение сработало

  • Оформите заказ с товарами, которые должны быть удалены из корзины после покупки.
  • После перехода на страницу благодарности (thank you) проверьте корзину — она должна быть пустой.
  • Для удаления конкретного товара — добавьте товар 123 в корзину вместе с 456, при добавлении 123 товар 456 должен удаляться.
  • Проверьте несколько сценариев, чтобы убедиться, что логика не удаляет товары в ненужных случаях.

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

  • Корзина не очищается после заказа: возможно, кеширование страницы благодарности или куки мешают обновлению. Проверьте, не используется ли кеширование страниц, и отключите его для страницы thank you.
  • Удаление товаров не срабатывает: убедитесь, что код подключен в functions.php или в плагине, и что в момент срабатывания хука корзина инициализирована (WC()->cart не равен null).
  • Удаление приводит к ошибкам: убедитесь, что используете корректные идентификаторы товаров и не удаляете элементы в цикле без корректного обращения к ключам.

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

  • Не используйте очистку корзины при добавлении товара без веской причины — это ухудшает UX.
  • Всегда проверяйте, что объект WC()->cart инициализирован, чтобы избежать фатальных ошибок.
  • При работе с удалением товаров из корзины лучше использовать хуки, которые срабатывают после завершения всех действий пользователя (например, после оформления заказа), чтобы не создавать лишние запросы.
  • Избегайте тяжелых операций внутри хуков WooCommerce, чтобы не замедлять процесс оформления заказа.

Сравнение способов очистки корзины после покупки

СпособПлюсыМинусы
Хук woocommerce_thankyou + WC()->cart->empty_cart()Простое и надежное удаление после успешного заказаНе сработает, если пользователь не дойдёт до страницы благодарности
Очистка корзины при добавлении товара (woocommerce_add_to_cart)Контроль корзины в момент добавленияМожет ухудшить UX, удаляя товары неожиданно
Очистка корзины вручную через JS после оформленияГибко, можно кастомизироватьМенее надежно из-за возможного отключения JS
Динамические CSS стили в Elementor: создание и управление через код
13.03.2026
Как создать свой шорткод в WordPress с применением Elementor
02.11.2025
Как добавить собственный CSS в Elementor без потери при обновлении
12.12.2025
WooCommerce: как исправить неработающий фильтр по атрибутам в Elementor
08.06.2026
Как создать автоматическое обновление элементов в Elementor с помощью AJAX
24.03.2026