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

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

Со временем база данных WooCommerce может засоряться отменёнными и неподтверждёнными заказами. Это приводит к увеличению размера базы данных, снижению производительности сайта и затрудняет администрирование. Автоматизация удаления таких заказов помогает поддерживать базу в чистоте без ручной работы.

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

  • В админке WooCommerce большое количество заказов со статусами cancelled и pending.
  • Замедленная работа запросов к таблице wp_posts с типом shop_order.
  • Ручное удаление заказов занимает много времени и несёт риск ошибок или удаления важных данных.

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

1. Создаём функцию для удаления заказов по статусу и времени

Основная логика — выбирать заказы с нужным статусом, созданные до определённой даты, и удалять их через стандартные функции WooCommerce с учётом всех связанных данных.

function wc_delete_old_orders_by_status( $status, $days_old = 7 ) {
    if ( ! in_array( $status, array( 'cancelled', 'pending' ), true ) ) {
        return;
    }

    global $wpdb;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );

    $orders = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
        'wc-' . $status,
        $date_threshold
    ) );

    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( $order ) {
            wp_delete_post( $order_id, true ); // Полное удаление
        }
    }
}

2. Настраиваем крон-задачу для автоматизации удаления

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

if ( ! wp_next_scheduled( 'wc_auto_delete_old_orders' ) ) {
    wp_schedule_event( time(), 'weekly', 'wc_auto_delete_old_orders' );
}

add_action( 'wc_auto_delete_old_orders', function() {
    wc_delete_old_orders_by_status( 'cancelled', 7 );
    wc_delete_old_orders_by_status( 'pending', 14 );
});

3. Добавляем управление интервалами и удаляем крон при деактивации

Чтобы корректно работать с кроном, нужно добавить интервал и очистить крон при деактивации темы или плагина.

add_filter( 'cron_schedules', function( $schedules ) {
    if ( ! isset( $schedules['weekly'] ) ) {
        $schedules['weekly'] = [
            'interval' => 7 * 24 * 60 * 60, // 7 дней
            'display'  => __( 'Еженедельно' ),
        ];
    }
    return $schedules;
});

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

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

  • В админке WooCommerce после запуска крон-задачи исчезнут заказы со статусами cancelled старше 7 дней и pending старше 14 дней.
  • Можно проверить наличие крон-события через плагин WP Crontrol или командой WP-CLI wp cron event list.
  • В базе данных таблица wp_posts больше не содержит старых заказов с указанными статусами.
  • Логи ошибок PHP и WooCommerce не содержат записей об ошибках удаления заказов.

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

  • Удаление не происходит: проверьте, что крон действительно активен и запускается. Используйте плагин WP Crontrol для диагностики.
  • Заказы не удаляются полностью: используйте wp_delete_post( $order_id, true ) с параметром true для полного удаления, иначе заказы могут попадать в корзину.
  • Удаляются нужные заказы: внимательно проверяйте условие по дате и статусу, чтобы не удалять активные заказы.
  • Проблемы с производительностью при удалении большого числа заказов: разбивайте удаление на партии, например по 50 заказов за раз, чтобы не нагружать сервер.

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

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

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

МетодПлюсыМинусы
Код на PHP с wp_cron (как в статье)Гибкость, не нужны плагины, можно настраивать под свои задачиНужно контролировать крон, требует навыков программирования
Плагины очистки заказов (например, "WooCommerce Order Cleaner")Простота установки, готовый интерфейсМогут конфликтовать, не всегда гибкие, лишние зависимости
Ручное удаление через админкуПростота, без риска автозапускаТрудозатратно, риск ошибок, не подходит для больших баз
Как разрешить доступ к административной панели WordPress по IP адресу
21.02.2026
WooCommerce: как автоматически удалять отменённые заказы без ошибок
07.07.2026
Как настроить логирование ошибок в WordPress для разработчиков
30.11.2025
Как удалить и заблокировать плагин в WordPress: практическое руководство с примерами
26.01.2026
WooCommerce: как автоматически удалять отменённые заказы без ошибок
15.07.2026
×
до 3225₽

WPShop - честная партнерка!

Зарабатывай с каждой продажи

Подключиться ⋙