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

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

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

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

Для начала определите, какие заказы действительно можно удалить без риска для бизнеса. Обычно это:

  • cancelled — отменённые заказы;
  • failed — неудачные платежи;
  • refunded — возвращённые;
  • заказы, созданные более 30-60 дней назад (зависит от вашей политики).

Проверьте число таких заказов SQL-запросом через phpMyAdmin или wpdb:

SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed', 'wc-refunded') AND post_date < NOW() - INTERVAL 30 DAY;

Если число большое — пора автоматизировать удаление.

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

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

Создайте в functions.php вашей темы (или лучше в кастомном плагине) следующий код:

function wpin_delete_old_orders() {
    $days = 30; // Удалять заказы старше 30 дней
    $statuses = array('wc-cancelled', 'wc-failed', 'wc-refunded');

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => "$days days ago",
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $old_orders = get_posts($args);

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_trash_post($order_id); // Можно заменить на wp_delete_post($order_id, true) для безвозвратного удаления
        }
    }
}

2. Запускаем функцию периодически через WP-Cron

Добавьте планировщик событий, если он ещё не добавлен:

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

add_action('wpin_daily_delete_old_orders', 'wpin_delete_old_orders');

Этот код будет запускать удаление раз в сутки.

3. Остановка планировщика при деактивации плагина (если используется плагин)

register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('wpin_daily_delete_old_orders');
});

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

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

  • В админке WooCommerce перейдите в раздел «Заказы» и фильтруйте по статусам cancelled, failed, refunded. Заказы старше 30 дней должны исчезнуть или перейти в корзину.
  • Проверьте базу данных через phpMyAdmin: SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed', 'wc-refunded') AND post_date < NOW() - INTERVAL 30 DAY; — результат должен быть 0 или значительно меньше.
  • Посмотрите логи WP-Cron, если используете плагин для мониторинга (например, WP Crontrol).

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

  • Заказы не удаляются
    Проверьте, активирован ли WP-Cron (в файле wp-config.php не должно быть define('DISABLE_WP_CRON', true); без альтернативного cron-задания на сервере).
  • Удаляются нужные заказы
    Убедитесь, что список статусов и период удаления настроены корректно, измените переменную $statuses и $days.
  • Удаление слишком медленное или вызывает таймаут
    Ограничьте количество заказов, удаляемых за один запуск, добавив параметр 'posts_per_page' => 50 и запускайте функцию чаще.
  • Заказы остаются в корзине (trash), не удаляются окончательно
    По умолчанию wp_trash_post() перемещает в корзину. Используйте wp_delete_post($order_id, true) для полного удаления, но будьте осторожны — восстановить заказ будет нельзя.

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

  • Перед автоматическим удалением сделайте резервную копию базы.
  • Если на сайте много заказов, разбивайте удаление на части (пагинация), чтобы не перегружать сервер.
  • Для точного контроля используйте сторонние плагины мониторинга WP-Cron, например, WP Crontrol.
  • Соблюдайте политику хранения данных для соответствия законам (например, GDPR).

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

МетодПреимуществаНедостатки
wp_trash_post()Безопасное удаление с возможностью восстановленияЗаказы остаются в корзине, занимают место
wp_delete_post(true)Полное удаление из базыНельзя восстановить, риск потери данных
Удаление SQL-запросомОчень быстроРиск повреждения базы, требует глубоких знаний
Плагины для очистки заказовУдобный интерфейс, настройкиДополнительная нагрузка, зависимость от плагина

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

  • Определить статусы и срок хранения заказов
  • Создать функцию удаления заказов с фильтрацией по дате и статусам
  • Зарегистрировать WP-Cron событие для периодического запуска
  • Протестировать работу на тестовом сайте или копии
  • Добавить логирование или уведомления при удалении (по желанию)
  • Обеспечить резервное копирование базы данных перед запуском
  • Мониторить выполнение через WP Crontrol или аналогичные инструменты
WooCommerce: решение проблемы неудачного удаления товаров из корзины при отсутствии на складе
06.06.2026
Как удалить неиспользуемые таблицы в базе данных WordPress
01.12.2025
Как использовать хуки в WordPress правильно: практическое руководство
14.11.2025
Как отключить Emoji в WordPress для ускорения сайта
16.04.2026
Как создать и использовать внутренний REST API в WordPress
18.01.2026