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

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

В WooCommerce бывает необходимость автоматически удалять товар из корзины, если он не соответствует определённым условиям. Примеры: товар снят с продажи, превышен лимит по количеству, товар несовместим с выбранными позициями, или пользователь не выполнил дополнительные требования.

Стандартных настроек WooCommerce для таких сценариев нет, поэтому приходится реализовывать логику через хуки и фильтры. Важно написать код так, чтобы он корректно срабатывал, не вызывал конфликтов и не ухудшал UX.

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

Часто проблему выявляют по симптомам:

  • Товар остаётся в корзине, хоть должен удаляться;
  • Удаление происходит, но не вовремя (после оформления заказа);
  • Клиент видит непонятные ошибки или баги в корзине;
  • Неправильный расчёт стоимости из-за остатков удалённых товаров.

Для диагностики:

  • Активируйте режим отладки WordPress (WP_DEBUG в wp-config.php);
  • Проверьте консоль браузера на JS-ошибки;
  • Логируйте данные корзины в нужном месте (через error_log или файл);
  • Проверьте, вызываются ли нужные хуки.

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

1. Используем хук woocommerce_before_calculate_totals

Этот хук срабатывает до пересчёта итоговой стоимости корзины. Здесь безопасно модифицировать содержимое корзины.

2. Пример кода для удаления товара по ID и условию количества

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

    // ID товара для удаления
    $target_product_id = 123;

    // Проходим по всем товарам в корзине
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( $cart_item['product_id'] == $target_product_id ) {
            // Условие: если количество больше 2, удаляем
            if ( $cart_item['quantity'] > 2 ) {
                $cart->remove_cart_item( $cart_item_key );
                wc_add_notice( 'Товар удалён из корзины, так как превышен лимит по количеству.', 'notice' );
            }
        }
    }
}

В этом примере товар с ID 123 удаляется, если его количество в корзине превышает 2.

3. Добавление проверки для исключений

Можно добавить дополнительные проверки, например, чтобы удаление происходило только для залогиненных пользователей или в зависимости от роли:

if ( is_user_logged_in() ) {
    $user = wp_get_current_user();
    if ( in_array( 'customer', (array) $user->roles ) ) {
        // Условие удаления
    }
}

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

Чтобы убедиться, что товар удаляется правильно:

  • Добавьте тестовый товар в корзину с количеством, превышающим условие;
  • Обновите страницу корзины и проверьте, что товар автоматически исчез;
  • Проверьте, что уведомление wc_add_notice отображается;
  • Просмотрите логи сервера на ошибки;
  • Проверьте, что итоговая сумма корзины пересчитывается корректно.

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

  • Удаление не срабатывает: возможно, код вставлен в неправильный файл или приоритет хука слишком низкий. Попробуйте разместить код в functions.php темы или в кастомном плагине, и увеличьте приоритет, например, до 20.
  • Удаление происходит после оформления заказа: хук выбран неправильно. Используйте woocommerce_before_calculate_totals для работы с корзиной, а не хуки, связанные с заказом.
  • Появляются ошибки JS или уведомления не показываются: убедитесь, что подключён скрипт WooCommerce и что wc_add_notice вызывается до вывода страницы.
  • Клиент не видит обновления корзины без перезагрузки: добавьте поддержку AJAX обновления корзины, если нужно.

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

  • Не используйте хук с очень высоким приоритетом, чтобы не замедлять загрузку страниц;
  • Избегайте лишних вызовов remove_cart_item — бегло перебирайте корзину;
  • Проверяйте права пользователя, чтобы не удалять товары у администраторов или редакторов по ошибке;
  • Если логика сложная, кешируйте результаты проверок на уровне сессии;
  • Тестируйте на staging-сайте перед продакшеном.

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

МетодПреимуществаНедостаткиПример
Хук woocommerce_before_calculate_totalsПростота, срабатывает до расчёта ценыНе подходит для удаления после оформления заказаПриведен выше
Хук woocommerce_cart_item_removedСрабатывает при удалении товараНе удаляет сам товар, только реагируетИспользуется для логирования
AJAX-обработчикОбновление корзины без перезагрузкиТребует JS и серверной логикиБолее сложная реализация
Автоматическое удаление старого контента в WordPress
07.04.2026
Автоматическое создание резервных копий в WordPress с помощью кода и плагинов
19.02.2026
Как создать последовательный импорт постов в WordPress с помощью REST API
04.03.2026
Как удалить и отменить редактирование постов в WordPress
11.01.2026
Кастомная аутентификация для REST API в WordPress: подробное руководство
27.02.2026