wpcompany.ru wordpress WPCompany

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

Диагностика проблемы с товарами в корзине после отмены заказа

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

Почему товары остаются в корзине после отмены заказа?

  • По умолчанию WooCommerce не очищает корзину при отмене заказа.
  • Отмена заказа может происходить автоматически через сторонние API или вручную в админке.
  • Товары, добавленные в корзину до оформления заказа, не связываются напрямую с самим заказом.

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

Для удаления товаров из корзины после изменения статуса заказа на «отменён» используем хук woocommerce_order_status_cancelled. Этот хук вызывается при смене статуса на «cancelled».

add_action('woocommerce_order_status_cancelled', 'clear_cart_after_order_cancelled');
function clear_cart_after_order_cancelled( $order_id ) {
    if ( ! is_admin() ) {
        return; // Очистка корзины только из админки, чтобы не удалять товары у других пользователей
    }

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

    $user_id = $order->get_user_id();
    if ( ! $user_id ) {
        return; // Заказ без зарегистрированного пользователя
    }

    $session_handler = WC()->session;
    if ( ! $session_handler ) {
        return;
    }

    // Получаем сессию пользователя по ID
    $session_handler->set_customer_session_cookie( true );
    WC()->cart->empty_cart();
}

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

Удаление товаров из корзины при входе пользователя с отменённым заказом

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

add_action('wp_login', 'clear_cart_if_cancelled_orders', 10, 2);
function clear_cart_if_cancelled_orders( $user_login, $user ) {
    $cancelled_orders = wc_get_orders(array(
        'customer' => $user->ID,
        'status'   => 'cancelled',
        'limit'    => -1,
    ));

    if ( ! empty($cancelled_orders) ) {
        WC()->cart->empty_cart();
    }
}

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

  • Создайте тестовый заказ и отмените его через админку WooCommerce.
  • Если пользователь авторизован, выйдите из аккаунта и войдите снова — корзина должна очиститься.
  • Для гостевого пользователя очистка корзины в текущей сессии не сработает, это ограничение WooCommerce.

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

  • Корзина не очищается для гостевых пользователей: WooCommerce не хранит сессии гостей в базе, очистить корзину удалённого пользователя невозможно программно.
  • Очистка корзины происходит для всех пользователей: Проверьте, что функция вызывается с проверкой текущего пользователя и сессии.
  • Не очищается корзина сразу после отмены заказа: Очистка возможна только в текущей сессии, для других — при входе пользователя.
  • Ошибки PHP при вызове WC()->cart: Убедитесь, что код выполняется в правильное время, например, после инициализации WooCommerce (хук init или позже).

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

  • Не очищайте корзину без явной проверки пользователя, чтобы не удалить товары у другого клиента.
  • Избегайте вызова WC()->cart->empty_cart() вне пользовательской сессии.
  • Для массовой очистки корзин пользователей с отменёнными заказами лучше использовать крон-задачи и прямую работу с сессиями в базе данных (если сессии хранятся в базе).

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

МетодОписаниеПлюсыМинусы
Хук woocommerce_order_status_cancelledОчистка корзины в текущей сессииПростота реализации, моментальное действиеРаботает только для текущей сессии, не для других пользователей
Очистка при входе пользователяПроверка отменённых заказов и очистка корзины при логинеРаботает для зарегистрированных пользователейНе действует для гостей, задержка очистки до входа
Управление сессиями напрямуюУдаление корзин через базу данных или кэшМассовое удаление, подходит для администраторовСложность реализации, риск ошибок
×

Время действовать!

Суперцены на
WordPress!

-20%
на премиум темы

Не упусти шанс ⋙