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

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

В WooCommerce бывают ситуации, когда нужно автоматически удалять товар из корзины по определённым условиям — например, если товар больше недоступен, при изменении пользовательских данных или при добавлении другого товара, несовместимого с текущим. Часто это требуется сделать программно, чтобы не заставлять пользователя вручную чистить корзину.

Без правильного хука и проверки состояния корзины можно получить ошибки, потерю товаров или некорректное поведение оформления заказа.

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

Для удаления товара из корзины в WooCommerce можно использовать хук woocommerce_before_calculate_totals. Он вызывается перед пересчётом стоимости корзины, что позволяет безопасно изменить содержимое корзины.

Другие хуки, например woocommerce_add_to_cart, не подходят для удаления товара после добавления, так как вызываются в момент добавления.

Пример кода удаления товара по ID из корзины

add_action('woocommerce_before_calculate_totals', 'remove_product_from_cart_by_id', 10, 1); 
function remove_product_from_cart_by_id($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    $product_id_to_remove = 123; // ID товара для удаления

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        if ($cart_item['product_id'] == $product_id_to_remove) {
            $cart->remove_cart_item($cart_item_key);
        }
    }
}

Этот код проверит все товары в корзине и удалит товар с ID 123.

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

  1. Определите условие удаления товара (например, товар с определённым ID или по метке).
  2. Добавьте код с использованием хука woocommerce_before_calculate_totals в файл functions.php темы или в кастомный плагин.
  3. В функции пройдитесь по корзине через $cart->get_cart() и удалите нужные товары через $cart->remove_cart_item().
  4. Проверьте, что условие срабатывает корректно, без ошибок.

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

Зайдите на страницу корзины и добавьте товар с ID, который вы хотите удалить программно. Обновите страницу — товар должен исчезнуть из корзины автоматически.

Для отладки можно временно добавить error_log в функцию или вывести сообщения через wc_add_notice:

wc_add_notice('Товар с ID ' . $product_id_to_remove . ' удалён из корзины', 'notice');

Частые ошибки при удалении товаров из корзины и как их исправить

  • Удаление товара не происходит: проверьте, что хук используется с правильным приоритетом и что условие внутри функции верно. Также убедитесь, что код не исполняется в админке (добавьте проверку is_admin()).
  • Ошибка "Cannot modify header information": не выводите никаких данных до отправки HTTP-заголовков, используйте wc_add_notice для сообщений пользователю.
  • Удаление товара вызывает бесконечный цикл: убедитесь, что удаление происходит только один раз и не вызывает повторный вызов пересчёта корзины.

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

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

Сравнение вариантов удаления товара из корзины

МетодГде использоватьПреимуществаНедостатки
Хук woocommerce_before_calculate_totalsПеред подсчётом корзиныБезопасно удаляет товары, работает на фронтендеМожет вызываться часто
Хук woocommerce_add_to_cartПри добавлении товараМожно предотвратить добавлениеНе подходит для удаления уже в корзине
JavaScript удаление на фронтендеВ браузере пользователяБыстрое визуальное удалениеНе защищено от обхода, не меняет серверные данные

Сервис определения шаблона и плагинов на сайте