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

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

По умолчанию WooCommerce хранит все заказы, включая отменённые и с возвратами. Это приводит к росту базы данных, замедляет админку и усложняет аналитику. Особенно актуально для магазинов с большим оборотом и частыми возвратами. Задача — автоматизировать удаление заказов со статусами cancelled и refunded, чтобы поддерживать базу в чистоте без ручного труда.

Анализ существующих методов удаления заказов

Через админку WooCommerce

Удаление единичных заказов возможно вручную, но это неудобно и неэффективно на больших объемах.

Сторонние плагины

Плагины вроде "Bulk Delete" или "WooCommerce Order Delete" позволяют массово удалять заказы, но требуют ручного запуска и могут конфликтовать с другими плагинами.

Кодовые решения

Автоматизация через WP-Cron и хуки — оптимальный вариант для контроля и интеграции с бизнес-логикой.

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

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

function wpbe_delete_old_cancelled_refunded_orders() {
    $args = array(
        'status' => array('cancelled', 'refunded'),
        'date_modified' => '<' . ( time() - 7 * DAY_IN_SECONDS ), // старше 7 дней
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders( $args );
    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

Функция получает заказы со статусами cancelled и refunded, изменённые более 7 дней назад, и удаляет их без возможности восстановления (true во втором параметре wp_delete_post).

2. Настройка WP-Cron для регулярного запуска

add_action('wpbe_delete_orders_cron', 'wpbe_delete_old_cancelled_refunded_orders');

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

Здесь создаётся ежедневное событие, вызывающее функцию удаления.

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

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

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

  • Подождать 24 часа после активации кода или запустить событие вручную через WP CLI: wp cron event run wpbe_delete_orders_cron.
  • Проверить в админке WooCommerce — заказы со статусами cancelled и refunded, изменённые более 7 дней назад, должны исчезнуть.
  • Проверить таблицу wp_posts в базе данных: записи с типом shop_order и указанными статусами должны быть удалены.

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

  • Заказы не удаляются: убедитесь, что WP-Cron работает (проверьте с помощью плагина WP Crontrol), или запустите событие вручную.
  • Удаляются не те заказы: проверьте правильность фильтра 'status' => array('cancelled', 'refunded') и даты изменения.
  • Проблемы с удалением из-за прав: убедитесь, что пользователь/процесс, запускающий функцию, имеет права на удаление постов.

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

  • Не удаляйте заказы сразу после смены статуса — давайте время на возможные изменения или возвраты.
  • Используйте батчи для удаления, если заказов очень много, чтобы не перегружать сервер. Например, ограничьте limit в wc_get_orders до 50 и вызывайте функцию несколько раз.
  • Всегда делайте резервную копию базы данных перед автоматическим удалением данных.
  • Для крупных магазинов рассмотреть использование WP CLI для запуска удалений вне HTTP-запросов.

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

МетодПлюсыМинусыРекомендации
Ручное удаление в админкеПросто, без кодаНужно много времени, риск забытьПодходит для малого количества заказов
Плагины массового удаленияУдобный интерфейс, массовое удалениеНе всегда автоматизация, возможны конфликтыИспользовать при отсутствии навыков программирования
Автоматизация через WP-Cron + кодПолный контроль, автоматизация, интеграцияТребует навыков, возможны ошибки в кодеЛучший вариант для профессионалов и крупных магазинов
Оптимизация базы данных WordPress: эффективные методы и примеры кода
10.11.2025
Как автоматизировать удаление нерабочих редиректов в WordPress
12.01.2026
Как использовать хуки для изменения функциональности WordPress без изменения кода темы
21.12.2025
Как удалить все посты определённого автора в WordPress
19.02.2026
Как сделать автоматический откат обновлений WordPress при ошибках
08.03.2026