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

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

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

Как определить наличие проблемы

  • Откройте phpMyAdmin или другой инструмент работы с базой данных.
  • Выполните запрос:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';
  • Если количество отменённых заказов превышает несколько тысяч, стоит автоматизировать их удаление.

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

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

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

function wpdirect_delete_cancelled_orders() {
    global $wpdb;
    // Получаем ID всех отменённых заказов старше 30 дней
    $query = 
        "SELECT ID FROM {$wpdb->posts} 
        WHERE post_type = 'shop_order' 
        AND post_status = 'wc-cancelled' 
        AND post_date < NOW() - INTERVAL 30 DAY";
    $order_ids = $wpdb->get_col($query);

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

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

Добавьте в functions.php следующие строки для регистрации собственного cron-события и хука:

if (!wp_next_scheduled('wpdirect_daily_cancelled_orders_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpdirect_daily_cancelled_orders_cleanup');
}

add_action('wpdirect_daily_cancelled_orders_cleanup', 'wpdirect_delete_cancelled_orders');

3. Очистка Cron при деактивации

Рекомендуется добавить функцию для удаления задачи при деактивации плагина или темы:

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

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

  • Перейдите в базу данных и выполните повторно запрос на количество отменённых заказов. Количество должно уменьшиться через 24 часа после срабатывания cron-задачи.
  • Проверьте логи сервера на отсутствие ошибок, связанных с wp_delete_post.
  • Для немедленной проверки временно замените time() в wp_schedule_event на time() + 60 — cron вызовется через минуту.

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

  • Отсутствует WP-Cron или он отключён: стандартный WordPress cron работает при посещении сайта. Если трафика мало, задачи не запускаются. Решение — настроить системный cron на сервере, вызывающий wp-cron.php регулярно.
  • Использование неправильного префикса таблицы: в коде используется $wpdb->posts, который учитывает префикс базы. Не используйте жёстко wp_posts, чтобы не сломать работу на сайтах с другим префиксом.
  • Удаление не происходит из-за прав: у пользователя базы должны быть права DELETE и SELECT.
  • Удаляются не только отменённые заказы: убедитесь, что в запросе правильно указан post_status = 'wc-cancelled'.

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

  • Не удаляйте заказы моложе 30 дней — это позволит сохранить статистику и избежать проблем с бухгалтерией.
  • Используйте wp_delete_post($id, true) для полного удаления, включая метаданные и связи.
  • Проверяйте нагрузку на сервер: если заказов очень много, лучше удалять партиями, например, 100 заказов за один вызов.
  • Для отладки используйте плагин WP Crontrol, чтобы мониторить и вручную запускать ваши cron-задачи.

Сравнение вариантов удаления отменённых заказов

МетодПреимуществаНедостатки
Ручное удаление через админкуПросто, без кодаНужно делать вручную, долго при большом объёме
Плагин для очистки заказовАвтоматизация, интерфейсДополнительная нагрузка, может конфликтовать
Код с WP-Cron (наш способ)Лёгкий, гибкий, без сторонних плагиновЗависит от работы WP-Cron, требует базовых навыков
Как создать автоматическую резервную копию WordPress без плагинов
13.02.2026
Как настроить отключение автоматических обновлений в WordPress
01.03.2026
Как создать автоматические нотификации в WordPress через Webhook
26.02.2026
Как создать автоматические заголовки для постов в WordPress
22.12.2025
Использование Transient API для кэширования данных в WordPress
09.04.2026