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

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

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

Как настроить автоматическое удаление неоплаченных заказов

Основные шаги решения

  1. Определить типы статусов заказов, которые нужно удалять (обычно pending, failed).
  2. Выбрать интервал времени, после которого заказ считается устаревшим (например, 24 часа).
  3. Создать функцию, которая будет находить и удалять такие заказы, используя WP_Query и функции WooCommerce.
  4. Запланировать выполнение этой функции через WP-Cron, чтобы удаление происходило автоматически по расписанию.

Пример кода для удаления заказов

function wc_delete_old_unpaid_orders() {
    $args = array(
        'status' => array('pending', 'failed'),
        'limit' => -1,
        'date_created' => '<' . (time() - DAY_IN_SECONDS), // заказы старше 1 дня
    );
    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        $order_age = current_time('timestamp') - $order->get_date_created()->getTimestamp();
        if ($order_age > DAY_IN_SECONDS) {
            $order->delete(true); // true - удалить навсегда
        }
    }
}

// Регистрируем крон задачу
add_action('wc_delete_old_unpaid_orders_hook', 'wc_delete_old_unpaid_orders');

function wc_schedule_delete_old_unpaid_orders() {
    if (!wp_next_scheduled('wc_delete_old_unpaid_orders_hook')) {
        wp_schedule_event(time(), 'hourly', 'wc_delete_old_unpaid_orders_hook');
    }
}
add_action('wp', 'wc_schedule_delete_old_unpaid_orders');

Как проверить, что удаление работает

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

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

  • Функция не удаляет заказы: Проверьте, что статусы заказов совпадают. В WooCommerce 3+ статусы передаются без префикса wc-, используйте pending, а не wc-pending.
  • Удаляются не все нужные заказы: Убедитесь, что фильтр по дате работает корректно. Метод get_date_created() возвращает объект DateTime, используйте getTimestamp() для сравнения.
  • Крон-задача не запускается: WP-Cron запускается при посещении сайта. Для стабильной работы на сервере можно настроить реальный системный cron, вызывающий wp-cron.php.
  • Удаление ведёт к потере данных: Метод delete(true) удаляет заказ полностью. Если нужно сохранить историю, используйте архивирование, а не удаление.

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

  • Перед внедрением функции сделайте резервную копию базы данных.
  • Не удаляйте заказы с другими статусами без необходимости.
  • Установите интервал удаления таким, чтобы покупатели успевали оплатить заказ.
  • Для больших магазинов используйте пакетное удаление с ограничением количества заказов за один запуск, чтобы избежать превышения лимитов по памяти и времени выполнения.
  • Используйте специализированные плагины для очистки базы, если не хотите писать код вручную. Например, Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpqa.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udalenie-neoplachennyh-zakazov) предлагает комплексные инструменты оптимизации.

Сравнение способов реализации

МетодПлюсыМинусыКогда использовать
Код через WP-CronГибкость, бесплатно, кастомизацияЗависит от посещаемости сайта, возможны сбои в cronСредние и крупные проекты с разработчиком
Плагин очистки базыПростота установки, готовый функционалМожет потребоваться платная версия, меньше контроляМалые магазины без разработчиков
Ручное удаление через админкуБезопасно, контролируемоТрудозатратно, не автоматизированоМаленькие магазины с низким трафиком
Как создать автоматические отзывы в WordPress с помощью плагина Expert Review
31.12.2025
Создать динамические шорткоды в WordPress с поддержкой параметров
14.04.2026
Как добавить автоматическое обновление плагинов в WordPress с помощью кода
24.02.2026
Создание автоматической обратной связи в WordPress с помощью WPRemark
19.03.2026
Как использовать WP-Cron для автоматизации задач в WordPress
17.04.2026