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

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

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

Как определить, что ваша база нуждается в очистке

  • В админке WooCommerce видите большое число заказов со статусом cancelled.
  • Сайт начинает работать медленнее, особенно страницы с заказами и отчётами.
  • База данных занимает много места из-за таблицы wp_posts с заказами.

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

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

function wpdirect_delete_cancelled_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

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

2. Регистрируем событие WP-Cron для периодического запуска

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

add_action('wpdirect_daily_cancelled_orders_cleanup', 'wpdirect_delete_cancelled_orders');

3. Добавляем код в functions.php вашей темы или в кастомный плагин

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

4. (Опционально) Удаление заказов старше определённого срока

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

function wpdirect_delete_old_cancelled_orders() {
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        '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);
        }
    }
}

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

  • После добавления кода и прохождения суток (или запуска WP-Cron вручную) проверьте базу заказов в WooCommerce — отменённые заказы должны исчезнуть.
  • В базе данных MySQL выполните запрос для проверки отсутствия отменённых заказов: SELECT COUNT(*) FROM wp_posts WHERE post_type='shop_order' AND post_status='wc-cancelled'; — результат должен быть 0 или значительно меньше.
  • Чтобы запустить WP-Cron вручную для проверки, используйте WP-CLI команду: wp cron event run wpdirect_daily_cancelled_orders_cleanup (если есть доступ к серверу).

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

  • Код не срабатывает, заказы не удаляются. Проверьте, что WP-Cron работает на сайте (иногда на локальных серверах или при отсутствии посетителей события не запускаются). Можно использовать плагины типа WP Crontrol для ручного запуска и отладки.
  • Удаляются не те заказы. Проверьте статус заказа — WooCommerce использует статус с префиксом wc- (например, wc-cancelled), а не просто cancelled.
  • Ошибка прав доступа. Убедитесь, что код выполняется в контексте, где есть права на удаление записей — обычно в админке или через WP-Cron это не проблема.
  • Удаление заказов удаляет связанные данные (товары, мета). Это нормальное поведение при использовании wp_delete_post с параметром true.

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

  • Удаление большого количества заказов за один раз может привести к нагрузке на базу. Если ожидается большое число отменённых заказов, используйте пагинацию и удаляйте партии по 50-100 заказов за раз.
  • Регулярно делайте резервные копии базы данных перед автоматической очисткой.
  • Для улучшения производительности можно отключить кэш и индексацию на время очистки.
  • Рассмотрите возможность интеграции с Clearfy Pro для оптимизации базы данных и управления статусами заказов.

Сравнение вариантов реализации удаления отменённых заказов

МетодПреимуществаНедостатки
Ручное удаление через админкуПростота, не требует кодаТрудоёмко, неавтоматично
Кастомный PHP-код с WP-CronПолная автоматизация, гибкостьТребуются навыки разработки, возможны ошибки при некорректном коде
Плагины очистки базы (Clearfy, WP Optimize)Удобный интерфейс, дополнительные функцииМожет удалять лишнее, нагрузка на сайт
Как отключить автоматические обновления WordPress для плагинов и тем
21.03.2026
WooCommerce: автоматическое изменение статуса заказа при отмене с оплатой
30.05.2026
WooCommerce: не отображаются страницы товаров и категорий — диагностика и решение
04.05.2026
Как избежать проблем с кешированием в WordPress
10.02.2026
WooCommerce: автоматическое изменение статуса заказа при отсутствии оплаты
22.06.2026