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

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

Иногда возникает задача автоматически удалять заказы WooCommerce после того, как оплата подтверждена. Это может быть актуально для цифровых товаров с ограниченным тиражом, тестовых заказов или для очищения базы от неактуальных записей.

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

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

  • Отсутствует триггер на событие успешной оплаты заказа.
  • Попытка удаления заказа происходит раньше, чем WooCommerce обновит статус.
  • Удаление через нестандартные методы приводит к ошибкам в базе.

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

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

Этот хук срабатывает, когда заказ меняет статус на "завершён" — обычно после успешной оплаты.

2. Добавляем функцию удаления заказа

add_action('woocommerce_order_status_completed', 'wp24_delete_order_after_payment', 10, 1);
function wp24_delete_order_after_payment($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Проверка типа заказа (например, только цифровые товары)
    $items = $order->get_items();
    $only_virtual = true;
    foreach ($items as $item) {
        if (!$item->get_product()->is_virtual()) {
            $only_virtual = false;
            break;
        }
    }
    
    if ($only_virtual) {
        // Удаляем заказ
        wp_delete_post($order_id, true);
    }
}

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

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

  • Создайте тестовый заказ с виртуальным товаром.
  • Произведите оплату, чтобы статус заказа сменился на «завершён».
  • Проверьте в админке WooCommerce, что заказ исчез из списка.
  • Можно проверить через запрос к базе данных: SELECT * FROM wp_posts WHERE ID = {order_id} AND post_type = 'shop_order' — запись должна отсутствовать.

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

  • Удаление заказов с неправильным статусом: убедитесь, что хук woocommerce_order_status_completed подходит для вашего сценария. Если оплата подтверждается другим статусом, используйте соответствующий хук, например, woocommerce_payment_complete.
  • Ошибка при получении объекта заказа: проверьте, что wc_get_order($order_id) возвращает объект, а не false.
  • Удаление заказов с физическими товарами: если не хотите удалять такие заказы, добавьте проверку на виртуальный товар, как в примере.
  • Проблемы с правами доступа: убедитесь, что код работает с правильными правами и не вызывается в неподходящее время.

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

  • Удаление заказов — необратимая операция, лучше делать резервное копирование базы перед внедрением.
  • Не удаляйте заказы, если у вас включена интеграция с учётом, отчётностью или сторонними CRM — это может нарушить целостность данных.
  • Вместо удаления можно рассмотреть перевод заказа в отдельный статус «архивный» и скрытие его из списка заказов через фильтры.
  • Если заказов много, массовое удаление лучше выполнять через WP CLI или отдельный скрипт по крону, чтобы избежать тайм-аутов.

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

МетодРеализацияПлюсыМинусы
Удаление через хук woocommerce_order_status_completedPHP код в functions.php, см. пример вышеАвтоматизация, простота реализацииРиск удаления важных заказов, влияет на отчёты
Перевод заказа в архивный статусСоздание кастомного статуса, фильтрация в админкеБезопасно, сохраняются данные для отчётовНе освобождает место в базе
Ручное удаление через админку или WP CLIАдминка или консольные команды WP CLIКонтроль, безопасноТрудоемко при большом количестве заказов
Автоматическое удаление отменённых заказов в WooCommerce: пошаговое решение
29.05.2026
Как добавить фильтрацию по подкатегориям в WooCommerce
25.05.2026
Как установить ограничение на регистрацию в WordPress по домену email
10.02.2026
Как добавить собственные поля в WordPress без плагинов
02.11.2025
Как добавить автоматическое удаление старых transient-данных в WordPress
22.01.2026