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

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

В стандартной установке WooCommerce отменённые или заблокированные (on-hold) заказы остаются в базе данных навсегда, что приводит к росту объёма таблиц и снижению производительности. Особенно это актуально для крупных магазинов с тысячами заказов. Автоматизация удаления таких заказов с отсрочкой позволяет сохранить данные для анализа в течение определённого времени, но при этом не захламлять базу.

Как работает статус заказа в WooCommerce

WooCommerce использует следующие статусы заказов:

  • pending — ожидает оплаты;
  • processing — оплата прошла, заказ обрабатывается;
  • on-hold — заказ поставлен на паузу (например, ожидание оплаты);
  • completed — заказ выполнен;
  • cancelled — заказ отменён;
  • refunded — заказ возвращён;
  • failed — оплата не удалась.

Наш сценарий — удалять заказы со статусом cancelled и on-hold после заданного периода (например, 30 дней).

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

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

function wptricks_delete_old_orders() {
    $statuses = array('cancelled', 'on-hold');
    $days = 30; // Количество дней до удаления
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    foreach ($statuses as $status) {
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => 'wc-' . $status,
            'posts_per_page' => -1,
            'date_query'     => array(
                array(
                    'column' => 'post_date',
                    'before' => $date_threshold,
                ),
            ),
            'fields' => 'ids',
        );

        $orders = get_posts($args);
        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // Полное удаление заказа
            }
        }
    }
}

2. Запускаем функцию по расписанию с помощью WP-Cron

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

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

// Обработка события
add_action('wptricks_daily_order_cleanup', 'wptricks_delete_old_orders');

// Очистка при деактивации темы или плагина
function wptricks_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wptricks_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wptricks_daily_order_cleanup');
    }
}

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

  • После установки кода подождите 24 часа или запустите хук вручную через WP-CLI: wp cron event run wptricks_daily_order_cleanup.
  • Проверьте в базе данных таблицу wp_posts: записи с post_type shop_order и статусами wc-cancelled или wc-on-hold, у которых дата старше 30 дней, должны быть удалены.
  • В админке WooCommerce убедитесь, что старые отменённые и заблокированные заказы отсутствуют.

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

  • Заказы не удаляются: Проверьте, запущен ли CRON и активен ли хук. Можно временно добавить error_log в функцию удаления для отладки.
  • Удаляются нужные заказы: Убедитесь, что фильтр по дате и статусу корректен. Не используйте wp_trash_post, если хотите удалить полностью — используйте wp_delete_post($id, true).
  • Повышенная нагрузка на базу: Если заказов очень много, делайте удаление партиями (например, по 100 заказов за один запуск), чтобы снизить нагрузку.

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

  • Не удаляйте заказы без отсрочки — сохраните данные для анализов и возвратов.
  • Используйте транзакции и бэкапы, если удаляете заказы массово.
  • Добавьте логирование в отдельный файл или таблицу для аудита удалённых заказов.
  • Оптимизируйте запросы с помощью индексов по дате и статусу в базе данных.

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

МетодПлюсыМинусыПример использования
Плагин (например, WooCommerce Cleaner)Простота настройки, интерфейсМожет быть тяжелым, нет гибкостиУстановка и настройка через админку
WP-Cron + кастомный кодГибкость, контроль, легковесностьТребует навыков разработкиКод из статьи
Ручное удаление через SQLБыстро для единичных случаевРиск ошибок, нет автоматизацииDELETE FROM wp_posts WHERE post_type='shop_order' AND post_status='wc-cancelled' AND post_date < '2023-03-01'
WooCommerce: как запретить регистрацию спамеров без плагинов
15.07.2026
WooCommerce: автоматическое возврат средств и смена статуса заказа через код
18.06.2026
Как создать автоматический редактор для WordPress с помощью AJAX
15.01.2026
WooCommerce: оформление заказа без перезагрузки страницы
13.05.2026
Автоматизация создания и удаления записей в WordPress через CRON
22.01.2026