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

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

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

Для диагностики накопления неоплаченных заказов выполните SQL-запрос в базе данных WordPress:

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

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

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

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

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

function wpb_delete_old_unpaid_orders() {
    $days = 7; // количество дней, после которых заказ удаляется
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-on-hold'),
        'date_query'     => array(
            'before' => $date_threshold,
            'inclusive' => true,
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true - без возможности восстановления
        }
    }
}

2. Регистрируем Cron задачу

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

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

add_action('wpb_delete_unpaid_orders_cron', 'wpb_delete_old_unpaid_orders');

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

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

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

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

Для проверки корректной работы выполните следующие действия:

  • Создайте тестовый заказ в статусе pending с датой старше 7 дней (можно через базу данных или установить дату вручную).
  • Запустите Cron вручную через WP-CLI (если есть доступ): wp cron event run wpb_delete_unpaid_orders_cron
  • Проверьте, что заказ удалился, выполнив SQL-запрос из раздела диагностики.
  • Через админку WooCommerce убедитесь, что заказ отсутствует.

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

  • Код не срабатывает по Cron: Проверьте, включен ли WP-Cron (define('DISABLE_WP_CRON', true) в wp-config.php отключит его). Для сайтов с высокой нагрузкой лучше настроить системный cron на запуск wp-cron.php.
  • Удаляются не те заказы: Убедитесь, что в post_status указаны правильные статусы. По умолчанию неоплаченные — wc-pending и wc-on-hold. Если используются другие статусы, добавьте их в массив.
  • Удаление не происходит из-за прав: Функция wp_delete_post требует, чтобы пользователь имел права на удаление. При запуске из Cron это может быть ограничено. Проверьте, что код запускается с необходимыми правами (например, через плагин или кастомный плагин).
  • Удаляются заказы, которые не нужно трогать: Проверьте условие даты date_query. Возможно, стоит увеличить или уменьшить период.

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

  • Не удаляйте заказы без резервного копирования базы данных.
  • Используйте WP-CLI для запуска Cron задач на больших сайтах, чтобы избежать таймаутов.
  • Ограничьте количество заказов, удаляемых за один запуск, если база очень большая, добавив параметр posts_per_page с числом, например, 50, и реализуйте пагинацию в удалении.
  • Чтобы избежать потери данных, уведомляйте администратора перед удалением (например, отправляйте email с отчетом).
  • Для расширенной аналитики используйте сторонние плагины, которые чистят заказы с расширенными фильтрами, если нужны дополнительные условия удаления.

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

МетодПлюсыМинусыКомпромисс
Кастомный код с CronПолный контроль, бесплатно, легко настроитьТребует навыков, возможны ошибки, безопасность на ответственности разработчикаДобавить логирование и уведомления
Плагины очистки WooCommerceПростота использования, поддержка, интерфейсИногда платные, могут иметь лишний функционал, нагрузка на сайтВыбирать легковесные и проверенные плагины
Ручное удаление через админкуПростота, точечное удалениеТрудоемко, неудобно для больших объемовИспользовать для единичных случаев
WooCommerce: решение проблемы с неотсылкой писем после покупки
30.06.2026
Как отключить Jetpack в WordPress по условиям: практические способы и примеры кода
26.01.2026
WooCommerce: использование хука woocommerce_order_status_changed для автоматизации процессов
25.06.2026
WooCommerce: как избежать проблем с отправкой писем после покупки
02.06.2026
Как создать собственный шорткод в WordPress
02.11.2025