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

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

В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending, failed или cancelled, которые никогда не были оплачены или обработаны. Это приводит к загромождению базы данных и снижению производительности, особенно на крупных сайтах с тысячами заказов. Автоматическое удаление таких заказов по срокам помогает держать базу в порядке и ускоряет работу админки.

Какие статусы заказов считать неактивными

Обычно под неактивными понимают заказы со статусами:

  • pending — заказ создан, но оплата не началась;
  • failed — оплата не удалась;
  • cancelled — заказ отменён пользователем или администратором.

Другие статусы, например processing или completed, обычно оставляют без изменений.

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

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

Решите, через сколько дней неактивные заказы должны удаляться. Например, 30 дней — стандартный срок для очистки.

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

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

function wpsocial_delete_old_inactive_orders() {
    $days = 30; // количество дней для хранения заказов
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'limit'        => -1,
        'status'       => array('pending', 'failed', 'cancelled'),
        'date_created' => '<' . $date_threshold,
        'return'       => 'ids',
    );

    $orders = wc_get_orders($args);

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

3. Добавляем крон-задачу для регулярного запуска

Чтобы функция запускалась автоматически, создайте событие WP-Cron. Добавьте код ниже в functions.php:

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

add_action('wpsocial_daily_delete_orders', 'wpsocial_delete_old_inactive_orders');

4. Очистка крон-задачи при деактивации

Если реализуете в плагине, добавьте удаление задачи при деактивации:

function wpsocial_deactivate_plugin() {
    wp_clear_scheduled_hook('wpsocial_daily_delete_orders');
}
register_deactivation_hook(__FILE__, 'wpsocial_deactivate_plugin');

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

  • Перейдите в WooCommerce → Заказы и отфильтруйте по статусам pending, failed, cancelled.
  • Создайте тестовый заказ с одним из этих статусов и датой создания старше 30 дней (можно вручную изменить дату в базе, например через phpMyAdmin).
  • Запустите функцию вручную из консоли разработчика WordPress или временно вызовите её напрямую в functions.php.
  • Проверьте, что заказ удалился из списка и из базы (таблица wp_posts и wp_woocommerce_order_items).

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

1. Заказы не удаляются

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

2. Удаление происходит, но заказы остаются в базе

  • Если передано wp_delete_post($order_id, false), заказ переводится в корзину, а не удаляется окончательно. Нужно установить второй параметр true.

3. Функция вызывает нагрузку на сайт

  • Ограничьте количество удаляемых заказов за один запуск: используйте параметр limit с небольшим числом, например 20, и запускайте функцию чаще.

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

  • Перед массовым удалением всегда делайте резервную копию базы данных.
  • Используйте транзакции или логи для отслеживания удалённых заказов — полезно для аудита.
  • Если сайт на большом трафике, лучше перенести крон-задачу на серверный cron для стабильности.
  • Проверяйте, что удаление не затрагивает связанные данные, например отзывы или пользовательские мета-поля.

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

Метод Плюсы Минусы
Плагин для очистки WooCommerce Простота установки, готовый интерфейс Часто платные, нагрузка, ограниченная кастомизация
Собственный код с WP-Cron Гибкость, контроль, бесплатно Нужно писать и тестировать, зависит от WP-Cron
Серверный cron + WP-CLI скрипт Надёжно, не зависит от посещений сайта, высокая производительность Требует доступа к серверу и навыков системного администрирования
Оптимизация изображений для WordPress: лучшие методы и плагины
10.11.2025
Как создать автопостинг в WordPress из социальных сетей
28.11.2025
WooCommerce: как автоматически удалять неактивные заказы по срокам
10.07.2026
Автопостинг из YouTube в WordPress с фильтрацией и обработкой контента
24.03.2026
WooCommerce: как автоматически удалять заказы по срокам
02.05.2026