WooCommerce: автоматическое удаление закрытых заказов

Диагностика проблемы с накоплением заказов в WooCommerce

При интенсивной работе интернет-магазина на WooCommerce база данных может быстро разрастаться за счёт большого количества заказов, особенно закрытых (статус completed, cancelled, refunded и т.д.). Это ведёт к замедлению работы сайта, увеличению размера бэкапов и усложнению администрирования. Поэтому важно периодически очищать такие заказы.

Как определить, что пора чистить базу заказов

  • В WooCommerce более 10 000 заказов со статусом, не требующим дальнейшей обработки
  • Замедленная работа панели администратора при работе с заказами
  • Увеличенное время резервного копирования базы данных
  • Большие таблицы wp_posts и wp_postmeta из-за заказов

Пошаговое решение: автоматическое удаление закрытых заказов с помощью WP-Cron

1. Определение статусов заказов для удаления

Рекомендуется удалять заказы со статусами, которые не влияют на отчёты и дальнейшую работу: completed, cancelled, refunded. Можно расширить список при необходимости.

2. Создание функции для удаления заказов

function wpmonitor_delete_old_closed_orders() {
    global $wpdb;
    $statuses_to_delete = array('completed', 'cancelled', 'refunded');
    // Формируем строку для SQL IN
    $in_statuses = implode("','", $statuses_to_delete);

    // Получаем заказы старше 30 дней
    $date_before = date('Y-m-d H:i:s', strtotime('-30 days'));

    // Получаем ID заказов, подходящих под критерии
    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' 
         AND post_status IN ('wc_" . str_replace(',', "','wc_", $in_statuses) . "') 
         AND post_date < %s",
         $date_before
    ));

    if (empty($order_ids)) {
        return;
    }

    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // true = без перемещения в корзину
    }
}

3. Планирование задачи с использованием WP-Cron

add_action('wpmonitor_daily_delete_orders', 'wpmonitor_delete_old_closed_orders');

function wpmonitor_schedule_daily_order_cleanup() {
    if (!wp_next_scheduled('wpmonitor_daily_delete_orders')) {
        wp_schedule_event(time(), 'daily', 'wpmonitor_daily_delete_orders');
    }
}
add_action('wp', 'wpmonitor_schedule_daily_order_cleanup');

4. Отключение задачи при деактивации темы или плагина

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

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

  • Проверить наличие запланированной задачи в wp-cron с помощью плагина WP Crontrol или аналогичного
  • Посмотреть количество заказов со статусами completed, cancelled, refunded в админке WooCommerce до и после выполнения задачи
  • Прогнать вручную функцию wpmonitor_delete_old_closed_orders через WP-CLI: wp eval 'wpmonitor_delete_old_closed_orders();' и проверить удаление
  • Отследить логи ошибок на предмет сбоев при удалении

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

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

  • Ошибка в статусах заказов — WooCommerce добавляет префикс wc_ к статусам, пример: wc_completed. В SQL запросе это учитывается.
  • Функция wp_delete_post не вызывается или возвращает false — проверить права пользователя и логи ошибок
  • WP-Cron не запускается — проверить, работает ли wp-cron.php на сервере или использовать системный cron

2. Удаление нужных заказов

  • Проверить фильтр по дате и статусу, чтобы не удалить актуальные или важные заказы
  • Добавить резервное копирование базы перед внедрением

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

  • Всегда делайте резервную копию базы данных перед автоматическим удалением заказов
  • Удаление заказов лучше выполнять вне пиковых часов работы сайта, чтобы не влиять на производительность
  • Если у вас большой магазин, рассмотрите пакетное удаление заказов с паузами (например, по 100 заказов за раз), чтобы избежать таймаутов PHP
  • Для крупных магазинов рекомендуется использовать системный cron вместо WP-Cron, чтобы задачи выполнялись стабильно
  • Отслеживайте логи ошибок PHP и WooCommerce для своевременного реагирования на проблемы

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

МетодПлюсыМинусыПример реализации
WP-Cron с PHP-кодомПростота внедрения, не требует дополнительного ПОЗависит от посещаемости сайта, может не срабатывать вовремяКод из статьи
Системный cron + WP-CLIСтабильное выполнение, подходит для больших магазиновТребует доступа к серверу и настройки cron
*/30 * * * * /usr/bin/wp eval 'wpmonitor_delete_old_closed_orders();' --path=/var/www/html
Плагины очистки заказовУдобный UI, дополнительные функции (логи, фильтры)Дополнительная нагрузка, возможные конфликтыНапример, "Bulk Delete" с настройкой по статусам
Как создать автоматический мониторинг сайта на WordPress для отслеживания доступности и ошибок
16.12.2025
Как настроить отправку email через SMTP в WordPress: практическое руководство
27.12.2025
Как избежать размытых изображений в WordPress: практическое руководство
29.01.2026
Как установить и настроить PHP Redis для ускорения WordPress
05.01.2026
WooCommerce: как установить лимит на количество товаров в корзине
21.07.2026