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

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

В интернет-магазинах на WooCommerce накапливаются отменённые и неактивные заказы, которые не нужны для дальнейшей работы и загромождают базу данных. Они увеличивают размер базы, замедляют запросы и делают отчёты менее точными. Чтобы проверить наличие таких заказов, выполните SQL-запрос в phpMyAdmin или через WP-CLI:

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

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

Как автоматически удалять отменённые и неактивные заказы в WooCommerce

Оптимальный способ — использовать планировщик WordPress (WP-Cron) для регулярного выполнения кода, который удалит заказы с нужными статусами. Ниже пример кода, который удаляет заказы со статусами wc-cancelled и wc-pending, старше 30 дней:

function wpb_delete_old_cancelled_orders() {
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-pending'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

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

// Планирование задачи при активации темы или плагина
if (!wp_next_scheduled('wpb_daily_delete_cancelled_orders')) {
    wp_schedule_event(time(), 'daily', 'wpb_daily_delete_cancelled_orders');
}

// Хук на ежедневное событие
add_action('wpb_daily_delete_cancelled_orders', 'wpb_delete_old_cancelled_orders');

Объяснение кода

  • get_posts получает ID заказов с нужным статусом, старше 30 дней;
  • wp_delete_post удаляет эти заказы без возможности восстановления;
  • Планировщик запускает функцию ежедневно — это достаточно часто для большинства магазинов.

Проверка результата

После внедрения кода можно проверить наличие старых заказов вручную через SQL-запрос, как в разделе диагностики, или в админке WooCommerce. Через пару дней после запуска скрипта старые отменённые и неактивные заказы должны исчезнуть.

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

function wpb_delete_old_cancelled_orders() {
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-pending'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
            error_log("Deleted order ID: " . $order_id);
        }
    }
}

Логи можно просматривать через файл wp-content/debug.log при включённом WP_DEBUG_LOG.

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

  • Отсутствие запланированного задания (Cron не работает): проверьте, что WP-Cron запускается корректно. Для этого посетите сайт и запустите команду wp cron event list через WP-CLI. Если Cron не срабатывает, настройте системный cron на сервере.
  • Неправильные статусы заказов: проверьте, что используете правильные статусы (например, wc-cancelled, wc-pending). Для кастомных статусов нужно корректно их указать.
  • Проблемы с правами на удаление: убедитесь, что код выполняется с правами администратора и что пользователь базы данных имеет права на удаление записей.
  • Удаление заказов с важными данными: всегда делайте резервные копии базы, чтобы избежать потери важных данных при ошибках в логике.

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

  • Запускайте удаление заказов в ночное время, чтобы не нагружать сервер в часы пик.
  • Ограничьте количество удаляемых заказов за один запуск, чтобы избежать тайм-аутов. Например, добавьте параметр 'posts_per_page' => 100 и несколько запусков.
  • Используйте постоянные резервные копии, как с помощью плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpbloger.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-otmenennyh-i-neaktivnyh-zakazov), чтобы быстро восстановиться при ошибках.
  • Для больших магазинов рассмотрите удаление заказов напрямую через SQL-запросы с осторожностью, чтобы повысить скорость.

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

МетодПлюсыМинусыПример
WP-Cron + wp_delete_post() Безопасно, учитывает все хуки WooCommerce, совместимо с плагинами Медленнее при большом количестве заказов, зависит от Cron Код из статьи
SQL-запрос на удаление (DELETE) Очень быстро для больших объёмов Может нарушить целостность базы, не запускает хуки DELETE FROM wp_posts WHERE post_type='shop_order' AND post_status='wc-cancelled' AND post_date < NOW() - INTERVAL 30 DAY;
Использование плагинов очистки Удобно, с интерфейсом, без кода Может быть платным, менее гибко Clearfy Pro — https://wpshop.ru/plugins/clearfy?utm_source=wpbloger.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-otmenennyh-i-neaktivnyh-zakazov
WooCommerce: решение проблемы с неотсылкой писем после покупки
30.06.2026
Как создать автоматический экспорт пользовательских данных в WordPress
24.03.2026
Как правильно проверять права доступа в WordPress
04.01.2026
Автоматическое удаление неактивных пользователей WordPress с помощью кода
27.03.2026
WooCommerce: автоматическое удаление отменённых заказов и диагностика проблем
06.07.2026