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

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

Многие владельцы WooCommerce сталкиваются с тем, что неоплаченные заказы накапливаются в базе, занимая место и создавая путаницу в отчетах. По умолчанию WooCommerce не удаляет неоплаченные заказы сразу после создания — они остаются в статусе pending или on-hold до ручного вмешательства. Это приводит к необходимости регулярной чистки базы или использования сторонних плагинов, которые могут быть избыточными.

Стандартный механизм удаления неоплаченных заказов, встроенный в WooCommerce, срабатывает только после определенного времени (обычно 30 дней), что не всегда подходит для бизнес-процессов с быстрым оборотом.

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

1. Создание функции для удаления неоплаченных заказов по истечении заданного времени

Для начала напишем функцию, которая будет искать неоплаченные заказы и удалять их, если они старше, например, 24 часов.

function wc_delete_old_unpaid_orders() {
    $args = array(
        'status' => array('pending', 'failed', 'on-hold'),
        'limit' => -1,
        'date_created' => '<' . ( new WC_DateTime() )->modify('-1 day')->format('Y-m-d H:i:s'),
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            $order->delete(true); // true - принудительное удаление из базы
        }
    }
}

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

Добавим планировщик, который будет запускать функцию ежедневно.

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

add_action('wc_unpaid_orders_cleanup_hook', 'wc_delete_old_unpaid_orders');

3. Удаление планировщика при деактивации темы или плагина

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

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

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

Для проверки работы решения:

  • Создайте заказ в статусе pending вручную или с помощью тестового оформления;
  • Измените дату создания заказа в базе данных, чтобы она была старше 24 часов (например, через phpMyAdmin);
  • Запустите задачу вручную, вызвав функцию wc_delete_old_unpaid_orders() из админки с помощью плагина для вставки PHP кода или WP CLI;
  • Проверьте, что заказ удален из списка заказов WooCommerce.

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

  • Задача WP Cron не запускается: Проверьте, что на хостинге включен WP Cron или настройте системный cron для запуска wp-cron.php. Без этого задача не выполнится автоматически.
  • Удаление заказов не происходит: Проверьте, что функция получает правильные статусы заказов и корректно фильтрует по дате. Используйте логирование внутри функции для отладки.
  • Удаление заказов не навсегда: Метод $order->delete(true) принудительно удаляет из базы. Если передается false или опущен параметр, заказы могут только переводиться в корзину.

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

  • Оптимизация запроса: При большом количестве заказов используйте постраничную обработку (limit и offset) для избежания превышения лимита памяти.
  • Логирование: Добавьте логирование удаленных заказов для аудита и обнаружения неожиданных удалений.
  • Резервное копирование: Перед внедрением автоматического удаления сделайте резервную копию базы данных.
  • Безопасность: Убедитесь, что код размещен в защищенных местах (свой плагин или functions.php дочерней темы), чтобы избежать случайного доступа извне.
  • Альтернативы: Рассмотрите плагин Clearfy Pro от WPShop для комплексной очистки и оптимизации WooCommerce с дополнительными функциями.

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

МетодПреимуществаНедостатки
Собственный код с WP CronМаксимальный контроль, без внешних зависимостей, гибкость настройки интервала и условийТребует базовых навыков PHP и понимания WP Cron, возможны проблемы с cron на хостинге
Плагины для очистки WooCommerceПростота установки, готовый функционал, поддержка и обновленияМогут быть избыточными, влиять на производительность, требовать платной версии
Ручное удаление через админкуБезопасно, не требует кодаТрудозатратно при большом количестве заказов, риск ошибок при массовом удалении
Как обновить WordPress без ошибок и потери данных
27.11.2025
WooCommerce: как удалить отзывы только с определённых товаров
09.06.2026
WooCommerce: как автоматически удалять заказы после отмены оплаты
17.05.2026
Как использовать REST API для управления пользователями в WordPress
07.01.2026
Как удалить пустые мета-данные в WordPress: эффективные методы и примеры
15.03.2026