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

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

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

Важно понимать, что WooCommerce не предусматривает такую автоматизацию из коробки. Решение нужно встраивать вручную или через код, чтобы избежать ошибок и потери важных данных.

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

1. Определяем подходящий статус заказа

По умолчанию после оплаты у заказа устанавливается статус processing или completed. Если вы хотите удалять, например, все оплаченные, но не доставленные заказы, нужно ориентироваться на статус processing.

2. Создаём WP-Cron задачу для регулярной очистки

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

function wpid_delete_orders_by_status() {
    $args = array(
        'limit' => -1, // Получить все заказы
        'status' => array('processing'), // Укажите нужный статус
        'return' => 'ids', // Получить только ID заказов
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        // Удаляем заказ полностью
        wp_delete_post($order_id, true); // true - принудительно удалить без корзины
    }
}

// Регистрируем событие, если оно ещё не зарегистрировано
if (!wp_next_scheduled('wpid_daily_delete_orders')) {
    wp_schedule_event(time(), 'daily', 'wpid_daily_delete_orders');
}

add_action('wpid_daily_delete_orders', 'wpid_delete_orders_by_status');

3. Добавляем возможность запуска вручную для тестов

Чтобы проверить работу функции без ожидания cron, можно вызвать её вручную через админку или временно подключить на хук admin_init:

// Временно для тестирования
add_action('admin_init', 'wpid_delete_orders_by_status');

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

Для проверки, что решение работает:

  • Создайте тестовый заказ в статусе processing.
  • Запустите функцию вручную (через временный хук admin_init или WP-CLI wp cron event run wpid_daily_delete_orders).
  • Проверьте, что заказ удалён из админки WooCommerce и из таблицы wp_posts в базе.
  • Убедитесь, что в логах ошибок нет записей об ошибках удаления.

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

Удаляются не те заказы или заказы удаляются преждевременно

Проверьте, что статус заказа указан правильно в параметре 'status' => array('processing'). Для уточнения статусов используйте функцию:

print_r(wc_get_order_statuses());

Также убедитесь, что вам действительно нужны заказы с данным статусом.

Заказы не удаляются

  • Проверьте, запущен ли WP-Cron. Для этого используйте плагин "WP Crontrol" и убедитесь, что событие wpid_daily_delete_orders в расписании.
  • Временно вызовите функцию вручную через admin_init, чтобы убедиться, что код работает.
  • Проверьте права пользователя, под которым происходит удаление, и корректность работы функции wp_delete_post.

Удаляемые заказы оставляют метаданные или связанные записи

Функция wp_delete_post($order_id, true) удаляет заказ полностью, но связанные записи в плагинах могут остаться. В этом случае нужно дополнительно очищать таблицы плагинов, если это критично.

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

  • Перед внедрением на рабочем сайте сделайте полный бэкап базы.
  • Не используйте массовое удаление для всех заказов, выбирайте конкретные статусы, чтобы избежать потери важных данных.
  • Добавьте логирование удалённых заказов для аудита (например, через error_log или сторонние библиотеки логирования).
  • Если база большая, обрабатывайте заказы пакетами, чтобы избежать превышения памяти или таймаута.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаТрудозатратно, риск ошибок при массовых операциях
WP-Cron с кастомным кодом (как в статье)Автоматизация, гибкость, не требует плагиновТребует базовых навыков программирования; зависит от WP-Cron
Плагины для очистки заказов (например, WP Bulk Delete)Удобный интерфейс, дополнительные функцииЗависимость от стороннего кода, возможны конфликты
WooCommerce: как автоматически удалять неактуальные купоны
05.07.2026
Как отключить кэширование страницы корзины в WooCommerce для корректной работы
20.04.2026
Как использовать REST API для создания простого плагина WordPress
03.12.2025
Как удалить неиспользуемые файлы из медиабиблиотеки WordPress без повреждения сайта
19.12.2025
WooCommerce: автоматическое удаление товаров после покупки с подробной настройкой
23.05.2026