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

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

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

Проверить, что товар по-прежнему в корзине, можно через консоль браузера (AJAX-запросы) или через отладку PHP, выводя содержимое WC()->cart->get_cart().

Пошаговое решение: удаление товара из корзины с помощью хука WooCommerce

1. Выбор правильного хука

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

2. Пример кода для удаления товара по 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;
    // ID товара, который нужно удалить
    $product_id_to_remove = 123;

    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 );
        }
    }
}

3. Удаление товара по мета-полю или условию

Если нужно удалять товары с определённым мета-значением, например, кастомным флагом:

add_action('woocommerce_before_calculate_totals', 'remove_products_with_meta_flag', 10, 1);
function remove_products_with_meta_flag( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return;

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product_id = $cart_item['product_id'];
        $flag = get_post_meta( $product_id, '_remove_from_cart', true );
        if ( $flag === 'yes' ) {
            $cart->remove_cart_item( $cart_item_key );
        }
    }
}

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

  • Добавьте товар с ID 123 или с мета-полем _remove_from_cart = yes в корзину.
  • Обновите страницу корзины или сделайте AJAX-обновление.
  • Проверьте, что товар исчез из корзины.
  • Включите режим отладки, если товар остался — добавьте error_log внутри цикла для диагностики.

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

  • Ничего не происходит при добавлении кода: проверьте, что функция подключена в functions.php активной темы или плагине, и нет конфликтов.
  • Удаление происходит, но после обновления страницы товар возвращается: возможно, корзина не сохраняется. Проверьте, что нет других плагинов, которые мешают сессии.
  • Удаление происходит слишком поздно, и сумма не пересчитывается: используйте хук woocommerce_before_calculate_totals, а не поздние хуки вроде woocommerce_cart_updated.
  • Ошибка при работе с AJAX: добавьте проверку is_admin() && ! defined('DOING_AJAX') для исключения админских запросов.

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

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

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

МетодПлюсыМинусы
Хук woocommerce_before_calculate_totalsБезопасно, пересчитывает сумму, работает при каждом обновлении корзиныВыполняется часто, нужно оптимизировать
Хук woocommerce_cart_updatedВызывается после обновления корзиныМожет быть слишком поздно для удаления и пересчёта суммы
AJAX-запросы вручнуюГибкий контроль, можно удалить без перезагрузкиСложнее реализовать, требует JS-кода
Автоматическое создание резервных копий в WordPress с помощью кода и плагинов
19.02.2026
WooCommerce: как программно удалять товар из корзины по условию
21.07.2026
Как создать автоматический мультиязычный сайт на WordPress
02.04.2026
Как настроить автоматическое обновление WordPress и плагинов
05.12.2025
Как создать последовательный импорт постов в WordPress с помощью REST API
04.03.2026