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

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

В стандартном WooCommerce заказы сохраняются в базе данных навсегда. В некоторых случаях, например, при тестировании, использовании сайта как витрины или для уменьшения нагрузки на базу, требуется автоматически удалять заказы с определённым статусом, например, после успешной оплаты (статус processing или completed).

Автоматическое удаление помогает поддерживать базу в чистоте и уменьшает размер таблиц wp_posts и wp_postmeta, что положительно сказывается на производительности.

Как проверить текущие статусы заказов и их влияние

Перед внедрением удаления важно понять, какие статусы у заказов используются на вашем сайте. Для этого в консоли WordPress можно выполнить SQL-запрос:

SELECT post_status, COUNT(ID) AS count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Результат покажет количество заказов в каждом статусе. Обычно после оплаты статусы меняются на processing или completed. Именно эти статусы мы будем использовать для удаления.

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

1. Создаём функцию удаления по статусу

Добавьте следующий код в файл functions.php вашей дочерней темы или в собственный плагин:

function wpid_delete_orders_by_status() {
    // Список статусов для удаления
    $statuses_to_delete = array('processing', 'completed');

    foreach($statuses_to_delete as $status) {
        $args = array(
            'post_type' => 'shop_order',
            'post_status' => $status,
            'numberposts' => -1,
            'fields' => 'ids',
        );
        $orders = get_posts($args);

        if(!empty($orders)) {
            foreach($orders as $order_id) {
                wp_delete_post($order_id, true); // true - без возможности восстановления
            }
        }
    }
}

2. Запускаем функцию по расписанию с помощью WP-Cron

Чтобы удаление происходило автоматически, добавим периодический крон-задачу:

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');

Этот код настроит ежедневное выполнение удаления заказов со статусом processing и completed.

3. Очистка крона при деактивации плагина или темы

Если вы реализуете это в плагине, в функции деактивации обязательно удалите расписание:

function wpid_deactivate() {
    $timestamp = wp_next_scheduled('wpid_daily_delete_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpid_daily_delete_orders');
    }
}
register_deactivation_hook(__FILE__, 'wpid_deactivate');

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

  • Подождите, пока выполнится cron (или запустите вручную через WP-CLI: wp cron event run wpid_daily_delete_orders).
  • Проверьте таблицы wp_posts и wp_postmeta — количество заказов со статусами processing и completed должно быть равно нулю.
  • Проверьте в админке WooCommerce, что заказы с этими статусами удалены.

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

  • Заказы не удаляются
    Проверьте, что WP-Cron работает корректно. На локальном сервере cron может не запускаться автоматически, используйте WP-CLI для теста.
  • Удаляются не те статусы
    Проверьте список статусов в запросе. Статусы могут быть кастомными или отличаться в вашей конфигурации WooCommerce.
  • Удаление вызывает ошибки
    Проверьте права пользователя, под которым запускается PHP, и доступность функций wp_delete_post.

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

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

Пример пакетного удаления с лимитом

function wpid_delete_orders_batch() {
    $statuses = array('processing', 'completed');
    $limit = 50; // количество заказов за раз

    foreach ($statuses as $status) {
        $args = array(
            'post_type' => 'shop_order',
            'post_status' => $status,
            'numberposts' => $limit,
            'fields' => 'ids',
        );
        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true);
            }
        }
    }
}

Такой метод можно запускать чаще — например, каждые час или 30 минут.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПросто, без кодаТрудоёмко при большом количестве заказовНебольшие объёмы, разовые операции
WP-Cron ежедневный удаление (код выше)Автоматизация, поддержка больших объёмовЗависит от работы WP-Cron, удаление может отложитьсяРегулярное удаление, средние объёмы
WP-Cron пакетный удаление с лимитомЛучше для больших баз, меньше нагрузкиСложнее настройка, требуется частый запускБольшие базы, интенсивное использование
Как отключить визуальные рендеры в WordPress для ускорения сайта
12.04.2026
Как добавить многоязычность в WordPress без плагинов
12.02.2026
Как создать автоматический бэкап базы данных в WordPress
02.02.2026
Как удалить метаданные из постов WordPress для оптимизации и безопасности
15.11.2025
Как отключить кэширование страницы корзины в WooCommerce для корректной работы
20.04.2026