Автоматическое удаление неоплаченных заказов WooCommerce старше 30 дней

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

В WooCommerce неоплаченные заказы (статус pending или failed) накапливаются в базе данных, что замедляет работу сайта и затрудняет управление заказами. Особенно это актуально для магазинов с большим трафиком и количеством заказов. Автоматическое удаление таких заказов через 30 дней помогает поддерживать базу в чистоте и улучшать производительность.

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

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

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

function wpkpi_delete_old_unpaid_orders() {
    // Параметры поиска заказов
    $args = array(
        'status' => array('pending', 'failed'),
        'date_created' => '<' . ( time() - 30 * DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

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

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

2. Регистрируем событие WP Cron

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

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

add_action('wpkpi_daily_delete_old_orders', 'wpkpi_delete_old_unpaid_orders');

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

Чтобы избежать накопления задач, добавьте очистку при деактивации плагина:

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

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

  • Создайте тестовый заказ со статусом pending с датой создания более 30 дней назад (можно вручную изменить дату в базе или использовать тестовый заказ старше 30 дней).
  • Запустите вручную функцию wpkpi_delete_old_unpaid_orders() через консоль WP-CLI: wp eval 'wpkpi_delete_old_unpaid_orders();'
  • Проверьте, что заказ удалился из админки WooCommerce и из базы данных (таблица wp_posts с типом shop_order).
  • Убедитесь, что WP Cron срабатывает ежедневно (можно использовать плагин WP Crontrol для просмотра и тестирования).

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

  • Заказы не удаляются: проверьте, что функция wpkpi_delete_old_unpaid_orders вызывается и в ней правильно формируется дата. Для отладки добавьте error_log() внутри цикла.
  • WP Cron не срабатывает: убедитесь, что на сайте есть трафик для запуска WP Cron, либо настройте системный cron для вызова wp-cron.php.
  • Заказы не удаляются полностью: используйте wp_delete_post($order_id, true) с вторым параметром true для полного удаления без помещения в корзину.
  • Проблемы с производительностью при большом количестве заказов: добавьте ограничение 'limit' => 100 и используйте пагинацию по пакетам для поэтапного удаления.

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

  • Не удаляйте заказы со статусами completed, processing, on-hold, чтобы не потерять данные о реальных продажах.
  • Перед удалением заказов можно добавить резервное копирование таблиц базы данных.
  • Для магазинов с большим объемом заказов используйте пакетную обработку с WP Cron и лимитом на удаление заказов за один запуск.
  • Используйте плагин Clearfy Pro для комплексной оптимизации базы и очистки WooCommerce данных.

Сравнение способов удаления неоплаченных заказов

МетодПлюсыМинусыПример кода/плагина
Ручное удаление через админкуПростотаТрудоемко, не подходит для большого количестваНет
WP Cron + кастомный кодАвтоматизация, гибкостьНужны базовые навыки программированияПример из статьи
Плагины оптимизации (Clearfy, WP Sweep)Удобство, дополнительные функцииМожет удалять лишнее, требует проверкиClearfy
Как избежать проблем с подключением стилей и скриптов в WordPress
27.01.2026
Как отключить AJAX в WordPress для решения проблем с конфликтами плагинов
21.03.2026
WooCommerce: автоматическое удаление товаров со статусом "Черновик" старше 30 дней
03.07.2026
Отложенный запуск задач в WordPress без Cron: практическое руководство
12.01.2026
Как создать автоматизированный отчет по KPI в WordPress с помощью WPKPI
24.01.2026