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

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

В WooCommerce накапливается большое количество заказов, в том числе с неактивными статусами (например, отмененные, просроченные, отклоненные). Это замедляет работу административной панели и увеличивает размер базы данных. Автоматическое удаление заказов по статусу помогает поддерживать базу в чистоте и улучшать производительность.

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

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

Для начала напишем функцию, которая найдет и удалит заказы с нужным статусом. В WooCommerce заказы — это кастомный тип постов shop_order, а статус хранится в мета-данных _order_status или в префиксе статуса wc-.

function wpapp_delete_orders_by_status( $status = 'cancelled' ) {
    if ( ! in_array( $status, wc_get_order_statuses(), true ) ) {
        return; // Статус не найден среди доступных
    }

    $args = [
        'limit'        => -1,
        'status'       => $status,
        'return'       => 'ids',
        'type'         => 'shop_order',
        'paginate'     => false,
    ];

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

2. Автоматизация удаления через WP-Cron

Чтобы удалять заказы периодически, регистрируем событие WP-Cron, например, раз в сутки.

// Регистрируем событие при активации темы или плагина
function wpapp_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wpapp_daily_order_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpapp_daily_order_cleanup' );
    }
}
add_action( 'wp', 'wpapp_schedule_order_cleanup' );

// Хук на событие
add_action( 'wpapp_daily_order_cleanup', function() {
    wpapp_delete_orders_by_status( 'cancelled' ); // Меняем статус по необходимости
});

// Для отмены при деактивации
function wpapp_clear_schedule_order_cleanup() {
    $timestamp = wp_next_scheduled( 'wpapp_daily_order_cleanup' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpapp_daily_order_cleanup' );
    }
}

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

  • В административной панели WooCommerce проверьте наличие заказов с нужным статусом до запуска задачи.
  • Запустите cron-задачу вручную, вызвав функцию wpapp_delete_orders_by_status('cancelled') через WP-CLI или временно добавив вызов в код.
  • Убедитесь, что заказы с указанным статусом исчезли из списка.
  • Проверьте таблицу wp_posts в базе данных: записи типа shop_order с этим статусом должны быть удалены.

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

  • Неправильный статус заказа: Статусы WooCommerce всегда идут с префиксом wc- в базе, например, wc-cancelled. В функции используйте простой ключ, например cancelled, так как wc_get_orders принимает короткие ключи. Проверяйте список доступных статусов через wc_get_order_statuses().
  • Заказы не удаляются, но скрываются: Используйте wp_delete_post( $order_id, true ) с параметром true для полного удаления, иначе посты могут попасть в корзину.
  • WP-Cron не срабатывает: Убедитесь, что на сервере настроен запуск cron или используйте внешние сервисы для пинга сайта. Для отладки можно вызвать функцию вручную.
  • Потеря данных: Перед внедрением сделайте резервную копию базы данных. Удаление заказов необратимо.

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

  • Перед удалением используйте фильтр, чтобы исключить важные заказы, например, с привязкой к активным подпискам.
  • Добавьте журналирование удалений — записывайте ID удаленных заказов в лог для аудита.
  • Для больших баз используйте пакетную обработку — удаляйте по 100 заказов за раз, чтобы избежать таймаутов.
  • Ограничьте права пользователя, который может запускать удаление, чтобы избежать случайного вызова.

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

МетодПлюсыМинусы
Ручное удаление через админкуПростота, не требует кодаТрудоемко при большом количестве заказов
Автоматизация через WP-Cron и кодПолное удаление, автоматизация, гибкостьНужно писать и тестировать код, возможен риск удаления неверных заказов
Плагины очистки базыУдобство, готовые решенияМогут быть платными, не всегда гибкие

Наш каталог плагинов WordPress