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

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

WooCommerce не имеет встроенного механизма для автоматического удаления отключённых (cancelled) и неоплаченных (pending, failed) заказов. Со временем база данных накапливает большое количество таких заказов, что замедляет работу сайта и усложняет администрирование. Если вы заметили, что вручную удалять заказы неудобно и плагинов для этого недостаточно, пора переходить к автоматизации через код.

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

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

Основная идея — запускать WP-Cron задачу, которая раз в сутки удалит все заказы со статусами cancelled, pending и failed старше определённого количества дней.

function wpscan_delete_old_wc_orders() {
    // Устанавливаем количество дней для хранения заказов
    $days_to_keep = 30;
    $date_before = date('Y-m-d H:i:s', strtotime("-{$days_to_keep} days"));

    // Получаем заказы с нужными статусами и датой до $date_before
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-pending', 'wc-failed'],
        'date_query'     => [
            [
                'before' => $date_before,
                'inclusive' => true,
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true для полного удаления
        }
    }
}

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

function wpscan_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpscan_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpscan_daily_order_cleanup');
    }
}
add_action('wp', 'wpscan_schedule_order_cleanup');

add_action('wpscan_daily_order_cleanup', 'wpscan_delete_old_wc_orders');

3. Опционально: добавляем ручной запуск из админки

Для удобства можно добавить кнопку в админ-панель, чтобы запускать очистку вручную без ожидания cron.

function wpscan_order_cleanup_admin_page() {
    if (isset($_POST['wpscan_cleanup_orders'])) {
        check_admin_referer('wpscan_cleanup_orders_nonce');
        wpscan_delete_old_wc_orders();
        echo '<div class="updated notice">Заказы успешно удалены.</div>';
    }
    ?>
    <div class="wrap">
        <h1>Очистка заказов WooCommerce</h1>
        <form method="post">
            <?php wp_nonce_field('wpscan_cleanup_orders_nonce'); ?>
            <input type="submit" name="wpscan_cleanup_orders" class="button button-primary" value="Удалить старые отключённые и неоплаченные заказы" />
        </form>
    </div>
    <?php
}

function wpscan_order_cleanup_menu() {
    add_submenu_page('woocommerce', 'Очистка заказов', 'Очистка заказов', 'manage_woocommerce', 'wpscan-order-cleanup', 'wpscan_order_cleanup_admin_page');
}
add_action('admin_menu', 'wpscan_order_cleanup_menu');

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

  • Запустите ручную очистку через админ-панель или дождитесь выполнения WP-Cron (раз в сутки).
  • Проверьте, что заказы со статусами cancelled, pending, failed старше 30 дней удалились из базы данных (раздел WooCommerce > Заказы).
  • Для дополнительной проверки можно использовать SQL-запрос к базе: SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-pending', 'wc-failed') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY); — число должно уменьшиться.

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

  • Заказы не удаляются: проверьте, что WP-Cron работает. Можно запустить вручную функцию wpscan_delete_old_wc_orders() через админку или с помощью отладки.
  • Удаляются не те заказы: убедитесь, что правильно указаны статусы в массиве post_status (должно быть с префиксом wc-).
  • Нагрузка на сервер при большом количестве заказов: добавьте постраничный запрос с лимитом и удаляйте заказы партиями, чтобы избежать таймаутов.
  • Ошибки прав доступа: убедитесь, что пользователь с ролью администратора имеет права manage_woocommerce для запуска ручной очистки.

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

  • Убедитесь, что удаление заказов происходит только по старым данным, чтобы не потерять актуальные заказы.
  • Для больших магазинов разбейте удаление на несколько циклов с помощью пагинации, например, по 100 заказов за раз.
  • Используйте WP-Cron с реальным системным cron для повышения надёжности выполнения задач.
  • Перед удалением создайте бэкап базы данных или экспорт заказов на случай ошибки.
  • Оптимизируйте базу и таблицы WooCommerce после массового удаления заказов с помощью плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpscan.ru&utm_medium=article&utm_campaign=woocommerce-udalenie-otkluchennyh-i-neoplachennyh-zakazov-s-pomoshhyu-koda) для поддержания производительности.

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

МетодОписаниеПреимуществаНедостатки
Плагины (например, WooCommerce Order Cleaner) Готовое решение с настройками в админке Простота установки, интерфейс Могут создавать нагрузку, ограничены в гибкости
Код на functions.php или в плагине Своя логика и расписание Гибкость, контроль, нет лишних плагинов Требует навыков, ответственность за правильность кода
Внешний скрипт с WP-CLI Запуск по cron на сервере Максимальная производительность, не зависит от WP-Cron Нужен доступ к серверу, навыки работы с консолью
Удаление метаданных из фото в WordPress: как защитить сайт и ускорить загрузку
04.01.2026
Как удалить заблокированные или замедленные заказы WooCommerce с помощью кода
01.05.2026
Как отключить REST API в WordPress для повышения безопасности
15.01.2026
Как автоматизировать удаление неиспользуемых плагинов WordPress
27.02.2026
Как отключить плагины на определённых страницах WordPress
06.02.2026