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

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

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

Как реализовать автоматическое удаление заказов по сроку через WP-Cron

1. Определяем логику удаления

Удаляем заказы, например, со статусом cancelled или failed, старше 30 дней. Можно адаптировать срок и статусы под свои нужды.

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

function wpgen_delete_old_wc_orders() {
    $days = 30; // Кол-во дней для хранения заказов
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

    $orders = wc_get_orders($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // Удаляем заказ насовсем
        }
    }
}

3. Регистрируем WP-Cron задачу

Добавляем хук для запуска функции, например, раз в сутки.

if (!wp_next_scheduled('wpgen_daily_delete_old_orders')) {
    wp_schedule_event(time(), 'daily', 'wpgen_daily_delete_old_orders');
}
add_action('wpgen_daily_delete_old_orders', 'wpgen_delete_old_wc_orders');

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

Чтобы не оставлять мусор в WP-Cron.

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

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

  • В базе данных (таблица wp_posts) проверить, что заказы со статусом cancelled старше 30 дней удалились.
  • Запустить вручную функцию wpgen_delete_old_wc_orders() через консоль WP-CLI или временно вызвать в шаблоне и проверить результат.
  • Проверить логи WP-Cron (например, с помощью плагина WP Crontrol), что задача срабатывает.

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

  • Заказы не удаляются: проверьте, что статусы указаны правильно и есть заказы, подходящие под фильтр.
  • WP-Cron не запускается: убедитесь, что на сайте есть трафик для срабатывания WP-Cron или настройте системный cron для wp-cron.php.
  • Удаляются лишние заказы: внимательно проверьте условие фильтрации в wc_get_orders, не используйте limit без разбора.

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

  • Удаляйте заказы только с нужными статусами, чтобы не потерять важные данные.
  • Не запускайте WP-Cron задачи слишком часто — достаточно раз в сутки.
  • При большом количестве заказов используйте постраничное удаление для избежания таймаутов.
  • Резервное копирование базы данных перед внедрением таких скриптов обязательно.

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

МетодПреимуществаНедостатки
WP-Cron + кастомный кодГибкость, нет сторонних плагинов, можно полностью контролировать логикуЗависит от посещаемости сайта, требует базовых навыков PHP
Плагины очистки заказовПростота установки, готовый функционалМогут быть избыточными, нагрузка на сайт, не всегда кастомизируемы
Ручное удаление через админкуПолный контроль, безопасностьТрудозатратно, не автоматизировано
Как автоматически устанавливать приватность записей в WordPress
18.02.2026
Как создать адаптивный велосипедный каталог на WordPress с фильтрами и сортировкой
27.12.2025
WooCommerce: автоматическое удаление заказов по сроку с помощью WP-Cron
15.06.2026
Как создать автозаполняемое поле для установки даты в WordPress
21.03.2026
Использование хука woocommerce_before_calculate_totals для изменения цен в корзине WooCommerce
06.05.2026