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

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

В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending или on-hold, которые так и не были оплачены. Это приводит к раздутой базе данных, замедлению работы админки и усложнению аналитики. Для магазинов с большим трафиком и частыми заказами это может стать серьёзной проблемой.

Проверить наличие таких заказов можно через админку WooCommerce в разделе Заказы с фильтром по статусу «Ожидает оплаты» или запросом к базе:

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

Если количество таких заказов велико и они долго не меняют статус, пора автоматизировать их удаление.

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

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

Ниже пример кода, который удаляет заказы со статусами wc-pending и wc-on-hold, созданные более 48 часов назад:

function wc_delete_old_unpaid_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-on-hold'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '48 hours ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
        }
    }
}

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

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

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

add_action('wc_delete_unpaid_orders_hook', 'wc_delete_old_unpaid_orders');

3. Очистка CRON при деактивации плагина или темы

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

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

  • Выполните вручную функцию wc_delete_old_unpaid_orders() через консоль WP-CLI или временно вызовите ее в коде и проверьте, что старые заказы удаляются.
  • С помощью SQL-запроса проверьте количество неоплаченных заказов до и после запуска cron-задачи.
  • В админке WooCommerce убедитесь, что заказы со статусом pending и on-hold старше 48 часов пропали.
  • Проверьте логи cron (плагин WP Crontrol или аналогичные) для подтверждения регулярного запуска задачи.

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

  • Код не удаляет заказы: проверьте, что статусы заказов указаны корректно с префиксом wc-. Также убедитесь, что у вас есть права на удаление постов.
  • Задача WP-Cron не запускается: на хостинге может быть отключён WP-Cron. Проверьте, что файл wp-cron.php вызывается регулярно через системный cron или настройте внешний триггер.
  • Удаляются нужные заказы: строго проверьте условие 'before' => '48 hours ago' и статусы, чтобы не удалить оплаченные.
  • Производительность падает при выборке: если заказов очень много, используйте постраничный запрос с 'posts_per_page' и цикл, чтобы не перегружать память.

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

  • Создавая функцию удаления, используйте wp_delete_post($order_id, true) для полного удаления без помещения в корзину.
  • Добавьте в функцию логи или уведомления (например, через error_log()), чтобы отслеживать удалённые заказы.
  • Если нужно более гибко управлять временем удаления, добавьте в настройки темы или плагина опцию для изменения интервала через административный интерфейс.
  • Для больших магазинов рассмотрите использование WP-CLI команд, которые можно запускать по расписанию из консоли хостинга.

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

СпособПлюсыМинусы
WP-Cron с PHP-кодомГибкость, кастомизация, нет сторонних плагиновЗависит от работы WP-Cron, требует навыков разработки
Плагины очистки заказов (например, "WooCommerce Cancel Abandoned Order")Простота установки, интерфейсМогут быть платными, нагрузка на сайт, ограниченная кастомизация
WP-CLI скриптыМаксимальная производительность, надежностьТребуется доступ к командной строке, навыки работы с WP-CLI
WooCommerce: автоматическое удаление неактивных клиентов
04.06.2026
Как избежать конфликтов между плагинами в WordPress: практические решения
25.12.2025
Создать и использовать собственный тип записи (Custom Post Type) в WordPress с примерами кода
14.01.2026
Как добавить дополнительные поля в WP REST API для кастомных типов записей
05.02.2026
Как использовать хук WooCommerce 'woocommerce_order_status_changed' для отправки дополнительных уведомлений
21.04.2026