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

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

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

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

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';

Если число превышает несколько тысяч, пора автоматизировать удаление.

Почему заказы остаются в статусе отменённых

  • Стандарт WooCommerce не предусматривает автоматического удаления отменённых заказов.
  • Отмена заказа не запускает удаление записи, чтобы сохранить историю и отчёты.
  • Ручное удаление заказов неудобно при большом объёме.

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

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

function wpmy_delete_old_cancelled_orders() {
    global $wpdb;
    // Удаляем отменённые заказы старше 30 дней
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s",
        $date
    ));

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true — принудительное удаление
        }
    }
}

2. Регистрируем событие WP-Cron для периодического запуска

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

add_action('wpmy_delete_cancelled_orders_hook', 'wpmy_delete_old_cancelled_orders');

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

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

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

  • В базе данных снова выполните запрос для подсчёта отменённых заказов и проверьте уменьшение их количества через неделю.
  • Для ручного теста вызовите функцию напрямую:
    wpmy_delete_old_cancelled_orders();
  • Проверьте логи сервера и debug.log на наличие ошибок.

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

  • Заказы не удаляются: Убедитесь, что WP-Cron работает (проверьте, вызывается ли событие). Если нет, настройте системный cron на вызов wp-cron.php или используйте плагин WP Crontrol.
  • Удаляются не только отменённые заказы: Проверьте правильность SQL-запроса и фильтрацию по post_status = 'wc-cancelled'.
  • Высокая нагрузка при удалении: При большом количестве заказов разделите удаление на порции, используя LIMIT в SQL и планируйте повторные события.
  • Ошибка прав доступа: Убедитесь, что пользователь базы данных имеет права на удаление записей.

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

  • Используйте принудительное удаление wp_delete_post($order_id, true), чтобы полностью удалить заказ и связанные метаданные.
  • Перед удалением создайте резервную копию базы данных — это позволит восстановить данные при ошибках.
  • Оптимизируйте расписание WP-Cron, чтобы не запускать удаление чаще одного раза в сутки.
  • Если у вас большой магазин, рассмотрите возможность использования внешнего планировщика cron для надёжности.
  • Для расширенной аналитики оставьте отменённые заказы в отдельной таблице или базы данных, если удаление не подходит.

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

МетодПлюсыМинусыРекомендации
Код на PHP + WP-Cron (как в статье) Полный контроль, отсутствие лишних плагинов, можно кастомизировать Зависит от корректной работы WP-Cron, требует навыков разработки Лучше всего для опытных разработчиков, подходит для всех магазинов
Плагины для очистки базы (например, WP-Sweep, Advanced Database Cleaner) Простота использования, интерфейс, дополнительные функции оптимизации Могут удалять лишнее, влияют на производительность во время очистки Подходит для тех, кто не хочет писать код, но требует тестирования
Ручное удаление через админ-панель WooCommerce Безопасно, визуально контролируемо Неэффективно при большом количестве заказов, трудозатратно Подходит для малых магазинов с редкими удалениями
Оптимизация базы данных WordPress: практические советы и примеры кода
04.11.2025
WooCommerce: автоматическое удаление отменённых заказов по расписанию
03.07.2026
Как создать собственный виджет WordPress с примерами кода
26.11.2025
Автоматическое удаление старых вариаций товаров WooCommerce с помощью WP-Cron
29.06.2026
Как оценивать и управлять загрузкой сервера WordPress
04.01.2026