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

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

В стандартном WooCommerce при отмене или провале платежа заказ остаётся в базе с соответствующим статусом (например, "failed" или "cancelled"). Это приводит к накоплению ненужных заказов, которые могут засорять базу, влиять на отчёты и создавать путаницу при учёте продаж. Автоматическое удаление таких заказов помогает поддерживать чистоту в базе и повысить удобство управления.

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

Для решения задачи нужно использовать хук, который срабатывает при изменении статуса заказа. При переходе статуса на "failed" или "cancelled" можно программно удалить заказ из базы.

Пример кода для functions.php вашей темы или собственного плагина

add_action('woocommerce_order_status_failed', 'wc_delete_order_on_failed', 10, 1);
add_action('woocommerce_order_status_cancelled', 'wc_delete_order_on_failed', 10, 1);

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

    // Безопасное удаление заказа
    wp_delete_post($order_id, true); // true - принудительное удаление без корзины
}

Этот код слушает переход заказа в статус "failed" или "cancelled" и моментально удаляет заказ из базы.

Пошаговое внедрение решения

  1. Откройте файл functions.php активной темы или создайте небольшой плагин для пользовательских функций.
  2. Вставьте приведённый код.
  3. Сохраните изменения и обновите сайт.
  4. Протестируйте: создайте тестовый заказ и имитируйте отмену платежа (можно вручную сменить статус заказа в админке WooCommerce).

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

  • Создайте заказ с любым способом оплаты.
  • Измените статус заказа на "failed" или "cancelled" в админке WooCommerce.
  • Обновите страницу списка заказов: заказ должен исчезнуть.
  • В базе данных (таблица wp_posts с типом shop_order) этот заказ больше не должен присутствовать.

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

  • Заказы не удаляются при смене статуса: проверьте, что хуки woocommerce_order_status_failed и woocommerce_order_status_cancelled не переопределяются другими плагинами или темой.
  • Удаляются не только отменённые заказы: убедитесь, что в функции удаляются только нужные статусы; можно добавить дополнительную проверку статуса через $order->get_status().
  • Ошибка доступа при удалении: функция wp_delete_post требует прав текущего пользователя, для этого код желательно запускать с правами администратора или в контексте, где это разрешено.

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

  • Удаление заказов — операция необратимая. Рекомендуется сначала архивировать данные заказов или создать резервную копию базы.
  • Если хотите сохранять историю, рассмотрите возможность автоматической смены статуса на кастомный, например, "archived_failed", вместо удаления.
  • Для больших магазинов с высокой нагрузкой лучше обрабатывать удаление заказов через асинхронные задачи или WP-Cron, чтобы не блокировать работу сайта.
  • Проверяйте совместимость с плагинами учёта и аналитики, которые могут зависеть от сохранения заказов.

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

ВариантПлюсыМинусыПрименимость
Удаление через хуки статуса (код выше)Простая реализация, моментальное удалениеРиск удаления важных данных, необратимоМалые и средние магазины без сложной аналитики
Отметить статусом "архив" и фильтровать в админкеСохраняется история, безопасно для аналитикиНе освобождает базу полностью, нужен дополнительный фильтрМагазины с отчётностью и аналитикой
Удаление по расписанию через WP-CronНе нагружает сайт, удаление пакетамиЗадержка удаления, сложнее в настройкеБольшие магазины с высокой нагрузкой
WooCommerce: как автоматически очищать корзину и сессии после оформления заказа
14.05.2026
Динамические отзывы с подтверждением покупателей в WordPress: практическое руководство
12.04.2026
WooCommerce: как изменить атрибуты товара после оформления заказа
05.06.2026
Как использовать REST API для создания кастомных эндпоинтов в WordPress
22.12.2025
Как запретить отображение отзывов по категории в WordPress
16.03.2026