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

Почему важно удалять неактивные заказы в WooCommerce

Скопление неактивных или просроченных заказов (например, со статусом "ожидает оплаты") в WooCommerce замедляет работу админки и увеличивает размер базы данных. Автоматическое удаление таких заказов повышает производительность магазина и упрощает управление.

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

При большом количестве заказов с долгим статусом "ожидает оплаты" или "обрабатывается" можно проверить их количество через SQL-запрос в базе данных:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold')

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

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

1. Определяем срок хранения неактивных заказов

Для примера возьмём 30 дней — заказы старше этого срока с определённым статусом будут удаляться.

2. Создаём планировщик задач (WP-Cron)

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

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

3. Реализуем функцию удаления неактивных заказов

add_action('wc_delete_old_inactive_orders', 'wc_delete_old_orders_callback');

function wc_delete_old_orders_callback() {
    global $wpdb;
    $days = 30; // количество дней хранения
    $statuses = [ 'wc-pending', 'wc-on-hold' ]; // статусы для удаления

    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    // Получаем ID заказов по условиям
    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN (%s, %s) AND post_date < %s",
        $statuses[0], $statuses[1], $date_threshold
    ));

    if (empty($order_ids)) {
        return; // нет заказов для удаления
    }

    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // принудительное удаление без корзины
    }
}

4. Проверяем регистрацию события WP-Cron

Для отладки используйте плагин WP Crontrol или вызовите вручную:

do_action('wc_delete_old_inactive_orders');

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

  • В базе данных уменьшилось количество заказов с указанными статусами и старше 30 дней.
  • В админке WooCommerce пропали старые неактивные заказы.
  • Если использовать плагин WP Crontrol, событие запускается без ошибок.

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

  • Ошибка в SQL-запросе: Важно правильно подставлять массив статусов. В примере выше для простоты используется два статуса, для большего количества нужна корректная подготовка запроса с плейсхолдерами.
  • Отсутствие WP-Cron: Если WP-Cron отключён, задача не сработает. Проверьте, что в wp-config.php нет define('DISABLE_WP_CRON', true); или настроен системный cron для wp-cron.php.
  • Удаление заказов с помощью wp_delete_post не работает: Проверьте права пользователя и подключение плагинов, которые могут блокировать удаление заказов.

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

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

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

МетодПлюсыМинусы
WP-Cron с кастомным кодомГибко, не требует плагинов, полный контрольЗависит от WP-Cron, требует знаний PHP
Плагины для очистки базы (например, WP-Sweep)Простота использования, готовые функцииМогут удалять лишнее, меньше контроля
Удаление вручную через SQLБыстро, без нагрузки на сайтРиск ошибок, требует доступа к БД
WooCommerce: как автоматически удалять неактивные заказы по срокам
10.07.2026
WooCommerce: как автоматически удалять старые заказы по срокам
11.06.2026
Как создать социальный чат в WordPress с применением WPRemark
25.02.2026
WooCommerce: как автоматически удалять неактивные заказы по срокам
21.05.2026
Как отключить AJAX пагинацию в WordPress и заменить на классическую
06.01.2026