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

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

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

Перед реализацией важно проверить, действительно ли требуется удалять товар из заказа, а не, например, менять статус заказа или создавать новый.

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

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

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

add_action('woocommerce_payment_complete', 'wplock_remove_product_after_payment');
function wplock_remove_product_after_payment($order_id) {
    if (!$order_id) return;

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

    $product_id_to_remove = 123; // ID товара, который нужно удалить

    foreach ($order->get_items() as $item_id => $item) {
        if ($item->get_product_id() == $product_id_to_remove) {
            $order->remove_item($item_id);
        }
    }

    $order->calculate_totals(); // Пересчитать итоговую сумму
    $order->save(); // Сохранить изменения
}

Этот код удалит из заказа товар с ID 123 после оплаты. Можно адаптировать условие, например, удалить все товары определённой категории или по метке.

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

  • Создайте тестовый заказ с нужным товаром.
  • Оплатите заказ (используйте тестовый платежный шлюз, например, Cheque или Cash on delivery для проверки).
  • Перейдите в админку WooCommerce — заказы и откройте заказ.
  • Убедитесь, что товар с указанным ID отсутствует в списке товаров заказа.
  • Проверьте итоговую сумму заказа — она должна быть пересчитана без стоимости удалённого товара.

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

  • Товар не удаляется после оплаты
    Проверьте, правильно ли указан ID товара. Используйте error_log или var_dump внутри функции, чтобы убедиться, что она вызывается.
  • Заказ не пересчитывается и итоговая сумма не меняется
    Убедитесь, что вы вызываете $order->calculate_totals(); и $order->save(); после удаления товаров.
  • Функция вызывается несколько раз
    Хук woocommerce_payment_complete может срабатывать повторно. Добавьте проверку-флаг в мета заказа, чтобы избежать повторного удаления.
  • Ошибка при удалении товаров с вариациями
    При работе с вариациями проверяйте $item->get_variation_id(), если нужно удалить вариацию.

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

  • Не удаляйте товары из заказов, если они нужны для истории покупок или аналитики. Лучше менять статус или создавать дополнительный мета-поле.
  • Удаление товаров — операция с изменением данных заказа. Всегда делайте резервные копии базы перед внедрением.
  • Используйте проверку nonce и права пользователя, если добавляете интерфейс для удаления товаров вручную.
  • Оптимизируйте работу с заказом, минимизируя количество вызовов save(), вызывайте её один раз после всех изменений.

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

МетодОписаниеПлюсыМинусы
Удаление через хук woocommerce_payment_completeАвтоматическая очистка после оплатыАвтоматизация, простой кодМожет нарушить историю заказов, риск ошибок
Изменение статуса товара или заказаМеняем статус вместо удаленияСохраняется история, безопаснееТребует дополнительной логики отображения
Создание нового заказа без удалённых товаровПереносим товары в новый заказПолный контроль над заказомСложнее реализовать, больше операций с БД
WooCommerce: как отключить автоматическое изменение атрибутов при выборе варианта товара
24.05.2026
Как сделать автоподсказку в поиске WordPress
25.02.2026
Как удалить неиспользуемые таблицы базы данных WordPress: практическое руководство
27.03.2026
Как добавить поддержку страниц со строительным кодом в WooCommerce
20.04.2026
Как удалить дублированные записи в WordPress с помощью кода
11.12.2025