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

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

В интернет-магазинах на WooCommerce количество заказов со статусом completed или cancelled может расти, занимая место в базе данных и замедляя её работу. Особенно это актуально для магазинов с большим потоком заказов. Ручное удаление заказов неудобно и неэффективно. Автоматизация процесса с помощью WP-Cron позволяет регулярно очищать базу от устаревших заказов, улучшая производительность.

Как работает WP-Cron для автоматизации задач в WordPress

WP-Cron — внутренний планировщик задач WordPress, который запускается при посещении сайта. Он позволяет выполнять произвольные функции по расписанию, например, удалять старые заказы WooCommerce.

Основные моменты:

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

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

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

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

    $args = array(
        'status' => 'completed',
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );

    // Получаем ID заказов
    $orders = wc_get_orders($args);

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

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

2. Регистрируем событие WP-Cron

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

3. Подключаем функцию к крону

add_action('wpm_daily_order_cleanup', 'wpm_delete_old_completed_orders');

4. Добавляем возможность сброса задачи при деактивации плагина (если код в плагине)

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

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

Чтобы убедиться, что код работает:

  • В базе данных wp_posts должны исчезнуть заказы со статусом completed, созданные более 30 дней назад (post_type = shop_order);
  • Можно временно изменить интервал на hourly и проверить удаление через час;
  • Для отладки используйте плагин WP Crontrol — он покажет запланированные задачи и позволит запускать их вручную;
  • В логах сервера или через функцию error_log можно выводить количество удалённых заказов.

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

  • Заказы не удаляются: Проверьте, что функция wpm_delete_old_completed_orders вызывается, используйте error_log внутри функции для отладки.
  • WP-Cron не срабатывает: На низкосерверных хостингах или при отсутствии трафика WP-Cron может не запускаться. Рекомендуется настроить системный cron для вызова wp-cron.php.
  • Удаляются не те заказы: Проверьте правильность условий в wc_get_orders, особенно параметр date_created и status.
  • Потеря важных данных: Убедитесь, что удалять нужно именно заказы со статусом completed или cancelled, а не активные.

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

  • Удаление заказов — необратимая операция. Рекомендуется делать резервные копии базы перед запуском кода.
  • Не удаляйте заказы с покупателями, которые могут понадобиться для бухгалтерии или аналитики.
  • Для крупных магазинов с десятками тысяч заказов лучше запускать удаление частями (пагинация), чтобы избежать тайм-аутов.
  • Для повышения надёжности используйте системный cron для вызова WP-Cron: wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  • Если используется плагин Clearfy Pro от WPShop, можно дополнительно оптимизировать базу данных и настроить автоматическую чистку.

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

  1. Добавить функцию удаления старых заказов с нужным статусом.
  2. Зарегистрировать cron-событие для запуска функции.
  3. Проверить работу запланированной задачи через WP Crontrol или аналог.
  4. Настроить системный cron для вызова WP-Cron (рекомендуется).
  5. Создать резервную копию базы данных.
  6. Запустить удаление и проверить базу.
  7. Мониторить логи и корректировать функцию при необходимости.
Как добавить динамические атрибуты в shortcode WordPress
01.03.2026
Как создать автоматический импорт постов в WordPress из внешнего источника
10.04.2026
Автоматическое удаление неактивных пользователей в WordPress
24.02.2026
Как автоматизировать удаление старого кеша в WordPress
27.01.2026
Оптимизация загрузки изображений в WordPress для ускорения сайта
06.02.2026