Диагностика проблемы: зачем автоматически удалять товары из корзины
В WooCommerce бывают ситуации, когда необходимо автоматически удалять из корзины товары, которые не соответствуют определенным условиям. Например, удалять просроченные акции, товары из запрещенных категорий, или товары, которые не доступны для текущего пользователя. Без такого механизма корзина может содержать некорректные позиции, что ведет к ошибкам оформления заказа и плохому UX.
Пошаговое решение: автоматическое удаление товаров из корзины при загрузке страницы
1. Используем хук woocommerce_before_calculate_totals
Этот хук срабатывает перед расчетом стоимости корзины. В нем можно проверить товары в корзине и удалить нужные.
2. Пример кода для удаления товаров из категории с ID 15
add_action('woocommerce_before_calculate_totals', 'custom_remove_products_from_cart_by_category');
function custom_remove_products_from_cart_by_category() {
// Получаем объект корзины
$cart = WC()->cart;
if ( ! $cart ) {
return;
}
// Итерируемся по товарам в корзине
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
// Проверяем принадлежит ли товар категории с ID 15
if ( has_term( 15, 'product_cat', $product->get_id() ) ) {
// Удаляем товар из корзины
$cart->remove_cart_item( $cart_item_key );
}
}
}3. Как добавить условие удаления по пользовательскому полю товара
add_action('woocommerce_before_calculate_totals', 'remove_products_by_custom_field');
function remove_products_by_custom_field() {
$cart = WC()->cart;
if ( ! $cart ) {
return;
}
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$product_id = $cart_item['product_id'];
$custom_flag = get_post_meta( $product_id, '_custom_remove_flag', true );
if ( $custom_flag === 'yes' ) {
$cart->remove_cart_item( $cart_item_key );
}
}
}Проверка результата после внедрения
- Добавьте в корзину товар из категории с ID 15 (или с пользовательским полем
_custom_remove_flagсо значениемyes). - Обновите страницу корзины. Товар должен автоматически исчезнуть.
- Для проверки можно временно добавить
error_logс выводом ключей удаляемых товаров.
Частые ошибки и как их исправить
- Хук не срабатывает: Убедитесь, что функция подключена в
functions.phpили в вашем плагине, и WooCommerce активен. - Товары не удаляются: Проверьте правильность ID категории и наличие товара в этой категории. Используйте отладку с
error_logдля проверки условий. - Ошибка «корзина пуста» после удаления: Не вызывайте удаление вне цикла или не используйте методы, которые могут сломать объект корзины.
- Проблемы с кешированием: Если корзина кэшируется, отключите кеширование для страниц корзины и оформления заказа.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы в цикле корзины — кэшируйте результаты, если нужно.
- Проверяйте, что WooCommerce загружен, чтобы избежать фатальных ошибок.
- Обрабатывайте удаление товаров только при необходимости, чтобы не создавать лишние перезапуски расчета корзины.
- Для сложных условий лучше использовать AJAX-обработчики с проверкой на стороне сервера.
Сравнение подходов: плагин vs код
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Легко адаптировать под любые условия; контроль над логикой; нет сторонних зависимостей | Требует знаний PHP; ошибки могут ломать сайт; труднее поддерживать для новичков |
| Готовый плагин (например, Conditional Cart Rules) | Быстрая установка; готовый UI для правил; поддержка и обновления | Может быть избыточным; не всегда покрывает все кастомные случаи; нагрузка от плагина |