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

Диагностика проблемы с заблокированными заказами в WooCommerce

В интернет-магазинах на WooCommerce часто накапливаются заказы с статусом failed или cancelled, а также с другими статусами, которые означают неудачные или заблокированные платежи. Эти записи не удаляются автоматически и со временем могут замедлять работу базы данных, увеличивать размер таблиц и усложнять аналитику.

Чтобы проверить наличие таких заказов, выполните SQL-запрос в базе данных WordPress:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-failed', 'wc-cancelled', 'wc-pending');

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

Пошаговое решение: автоматическое удаление заблокированных заказов с помощью WP-Cron

1. Определяем статусы для удаления

Обычно удаляют заказы со статусами:

  • wc-failed — неудачные платежи
  • wc-cancelled — отменённые вручную или системой
  • wc-pending — неоплаченные заказы, забытые пользователями

2. Создаём функцию удаления заказов

Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:

function wpaction_delete_blocked_orders() {
    $statuses_to_delete = array( 'wc-failed', 'wc-cancelled', 'wc-pending' );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses_to_delete,
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'date_query'     => array(
            array(
                'before' => '30 days ago', // Удаляем заказы старше 30 дней
                'inclusive' => true,
            ),
        ),
    );

    $orders = get_posts($args);

    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Принудительное удаление
    }
}

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

Добавьте хук для запуска функции один раз в сутки:

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

add_action('wpaction_delete_blocked_orders_daily', 'wpaction_delete_blocked_orders');

4. Очистка по требованию (опционально)

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

add_action('admin_post_wpaction_manual_delete_orders', function() {
    if (!current_user_can('manage_woocommerce')) {
        wp_die('Доступ запрещён');
    }
    wpaction_delete_blocked_orders();
    wp_redirect(admin_url('edit.php?post_type=shop_order&message=deleted'));
    exit;
});

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

  • Запустите вручную функцию через WP-CLI:
    wp eval 'wpaction_delete_blocked_orders();'
  • Проверьте количество заказов со статусами wc-failed, wc-cancelled и wc-pending до и после запуска:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-failed', 'wc-cancelled', 'wc-pending');
  • Убедитесь, что по истечении суток заказы старше 30 дней удаляются автоматически (проверьте логи WP-Cron или временно добавьте запись в лог внутри функции).

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

  • Заказы не удаляются, WP-Cron не запускается. Проверьте, активен ли WP-Cron на сайте. Для этого создайте файл wp-cron-check.php с кодом wp_cron() и запустите его. Иногда необходимо настроить системный cron или использовать плагин WP-Crontrol.
  • Удаляются не те заказы или отсутствует фильтр по дате. Проверьте правильность параметров date_query и статусов в массиве $statuses_to_delete.
  • Ошибка доступа при ручном запуске. Убедитесь, что текущий пользователь имеет право manage_woocommerce или замените на manage_options, если требуется.
  • Удаление занимает слишком много времени или вызывает таймаут. В этом случае разбейте удаление на чанки, например, по 100 заказов за один запуск, и используйте повторный запуск WP-Cron.

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

  • Всегда делайте резервную копию базы данных перед автоматическим удалением заказов.
  • Используйте wp_delete_post($order_id, true) с флагом true для принудительного удаления, чтобы исключить попадание в корзину.
  • Чтобы избежать нагрузки на сервер, планируйте удаление в ночное время и делайте это пакетами.
  • Для мониторинга работы WP-Cron включите логирование через плагин WP Crontrol или добавьте кастомные записи в лог-файл.
  • Если у вас большое количество заказов, рассмотрите возможность удаления не только заказов, но и связанных метаданных через прямые SQL-запросы, однако делайте это с осторожностью.

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

МетодПлюсыМинусы
Ручное удаление через админкуПростота, безопасностьТрудоёмко при большом количестве заказов
Автоматизация через WP-Cron и PHPПолная автоматизация, гибкость настройкиНеобходимость контроля WP-Cron и правильного кода
Использование плагинов очистки базыУдобство, интерфейсРиск несоответствия требованиям, нагрузка, стоимость
Оптимизация кода WordPress: как найти и удалить неиспользуемые хуки
24.01.2026
WooCommerce: как автоматически удалять товар из каталога при отсутствии на складе
17.05.2026
Как создать динамические таблицы в WordPress с помощью шорткода
17.12.2025
Как удалить пустое меню в административной панели WordPress
31.03.2026
Как создать настройки темы в WordPress с примерами кода
18.11.2025