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

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

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

Проверить количество таких заказов можно в базе, например, через phpMyAdmin, выполнив запрос:

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

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

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

1. Регистрация крон-задачи

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

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

2. Функция удаления заказов

Реализуем функцию, которая будет удалять заказы старше 30 дней со статусом отменён или возвращён:

add_action( 'wc_auto_delete_cancelled_refunded_orders', 'wc_delete_old_cancelled_refunded_orders' );

function wc_delete_old_cancelled_refunded_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-refunded'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '30 days ago',
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    ];

    $orders = get_posts( $args );

    if ( ! empty( $orders ) ) {
        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true ); // Полное удаление без перемещения в корзину
        }
    }
}

3. Очистка крон-задачи при деактивации плагина или темы

Рекомендуется убрать крон-задачу при деактивации, чтобы не оставлять мусор:

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

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

  • Выполните вручную запуск крон-задачи через WP-CLI: wp cron event run wc_auto_delete_cancelled_refunded_orders или вызовите функцию напрямую.
  • Проверьте в админке WooCommerce раздел заказов: отменённые и возвращённые, старше 30 дней, должны исчезнуть.
  • В базе данных убедитесь, что заказы с post_status 'wc-cancelled' и 'wc-refunded', датированные более 30 дней назад, удалены (см. SQL-запрос в разделе диагностики).
  • Просмотрите логи ошибок PHP (при наличии) на предмет проблем с удалением.

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

  • Удаление не происходит: Проверьте, что WP-Cron работает на вашем хостинге. Для теста запустите cron вручную через WP-CLI.
  • Заказы не удаляются полностью: Функция wp_delete_post с параметром true удаляет заказ без перемещения в корзину. Если параметр отсутствует или false, заказы останутся в корзине.
  • Выполнение занимает слишком много времени: При большом количестве заказов разбейте удаление на партии по 100-200 заказов, используя параметр posts_per_page.
  • Удаляются нужные заказы: Проверьте условия выборки и дату в date_query, чтобы не удалить свежие или важные заказы.

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

  • Сделайте резервную копию базы перед внедрением автоматического удаления.
  • Добавьте журналирование удалённых заказов для аудита, например, через запись в лог файл или отдельную таблицу.
  • Для больших магазинов используйте WP-CLI скрипты для пакетного удаления без нагрузки на сайт.
  • Оптимизируйте таблицы базы данных после удаления заказов с помощью OPTIMIZE TABLE wp_posts.
  • Используйте транзакции, если работаете с кастомными таблицами и метаданными заказов.

Сравнение подходов: плагин vs. кастомный код

КритерийПлагинКастомный код
ГибкостьОграничена функционалом плагинаПолный контроль над логикой и условиями удаления
ПроизводительностьМожет быть избыточен, загружает лишними функциямиОптимизирован под конкретную задачу
БезопасностьЗависит от качества плагинаМожно внедрить собственные проверки и логи
Поддержка и обновленияЕсть поддержка разработчикаТребует самостоятельного сопровождения
ВнедрениеБыстрое, без кодаТребует навыков PHP и тестирования
Автоматическое удаление заказов WooCommerce по неактивности без плагинов
24.06.2026
WooCommerce: автоматическое удаление заказов по неоплаченному статусу и срокам
05.07.2026
Как избежать конфликтов плагинов в WordPress: практические советы и примеры кода
07.04.2026
Автоматическое удаление заказов WooCommerce по статусу: как настроить
18.04.2026
WooCommerce: автоматическое удаление заказов после отмены или возврата
16.05.2026