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

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

В WooCommerce часто возникает задача — автоматически удалять заказы со статусом completed, cancelled или refunded через определённое время, чтобы не перегружать базу. Однако стандартный код с WP-Cron или хуками часто не работает должным образом: заказы не удаляются, или процесс прерывается.

Причины могут быть следующие:

  • WP-Cron не запускается из-за низкой активности сайта или отключённого системного cron;
  • код удаления не учитывает зависимости заказов и связанные данные — удаление прерывается из-за ошибок в базе;
  • неправильное использование функций WooCommerce и WordPress для удаления заказов;
  • ограничения хостинга на длительное выполнение скриптов или ограничения MySQL;
  • отсутствие проверки прав на удаление заказов;
  • конфликты с другими плагинами, которые блокируют удаление заказов.

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

1. Настройка системного cron для запуска WP-Cron

WP-Cron зависит от посещений сайта, что не всегда гарантирует своевременный запуск задач. Лучше настроить системный cron, который будет вызывать wp-cron.php с интервалом, например, каждые 15 минут.

*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Замените https://example.com на ваш URL.

2. Создайте кастомную функцию для удаления заказов старше N дней

Используйте правильный класс WC_Order_Query для выборки заказов, а затем удаляйте их через метод wp_delete_post с параметром true для полного удаления.

function wpassist_delete_old_completed_orders() {
    $days = 30; // количество дней
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'limit' => -1,
        'status' => ['completed', 'cancelled', 'refunded'],
        'date_created' => '<' . $date,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        // Проверяем права
        if (!current_user_can('delete_post', $order_id)) {
            continue;
        }
        // Полное удаление заказа и связанных данных
        wp_delete_post($order_id, true);
    }
}

3. Запланируйте запуск функции через WP-Cron

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

add_action('wpassist_delete_old_orders_hook', 'wpassist_delete_old_completed_orders');

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

  • Подождите 24 часа или форсируйте выполнение WP-Cron вручную (через плагин WP Crontrol или вызов скрипта).
  • Проверьте в базе данные заказов со статусами completed, cancelled, refunded, созданных старше 30 дней — они должны отсутствовать.
  • Проверьте журнал ошибок сервера на наличие ошибок при удалении.
  • Проверьте, что новые заказы не удаляются преждевременно.

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

  • WP-Cron не запускается: Настройте системный cron или используйте плагин WP Crontrol для ручного запуска.
  • Удаление прерывается из-за ограничений прав: функция проверяет current_user_can('delete_post'), убедитесь что выполняется с нужными правами (например, от имени администратора).
  • Заказы не удаляются, потому что используются неправильные статусы или неверный формат даты: используйте стандартные статусы WooCommerce и формат даты Y-m-d H:i:s.
  • Удаляются не те заказы или слишком новые: проверьте логику вычисления даты и фильтрации в wc_get_orders.
  • Конфликты с другими плагинами: временно деактивируйте подозрительные плагины и проверьте работу скрипта.

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

  • Обработка партий: если заказов много, разбейте удаление на партии по 50–100 штук, чтобы избежать превышения лимитов памяти и времени выполнения.
  • Логи и отчёты: ведите логи удалённых заказов для последующего аудита.
  • Резервное копирование: перед массовым удалением сделайте резервную копию базы данных.
  • Безопасность: не удаляйте заказы просто по ID, всегда проверяйте права и статусы.
  • Оптимизация запросов: используйте индексы в базе для поля post_date и post_status (стандарт в WordPress), чтобы ускорить выборку.

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

МетодПлюсыМинусыПримеры
Плагин (например, WP Bulk Delete)Простота настройки, графический интерфейсДополнительная нагрузка, ограничения функционалаClearfy Pro помогает с оптимизацией
Кастомный код с WP-CronГибкость, контроль, без лишних плагиновНужны знания, возможны ошибки в кодеПример кода в статье
Ручное удаление из базы (SQL)Скорость, прямой контрольРиск повредить данные, отсутствие связейНе рекомендуется для новичков
WooCommerce: автоматическое отключение неактивных товаров по времени
11.06.2026
WooCommerce: как автоматически удалять старые отзывы по дате
17.06.2026
Как создать автоматическое обследование сайта в WordPress для выявления проблем
25.12.2025
WooCommerce: как автоматически отключать неактивные товары по времени
13.07.2026
Как использовать метаданные в WordPress для оптимизации сайта
12.11.2025