WooCommerce: как автоматически отключить отложенные оплаты при превышении срока

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

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

Для диагностики проблемы проверьте количество заказов со статусом on-hold и pending, которые не обновлялись более 7-14 дней. Это можно сделать через SQL-запрос к базе данных или программно:

global $wpdb;
$days = 14;
$results = $wpdb->get_results($wpdb->prepare(
    "SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND post_status IN ('wc-on-hold', 'wc-pending') AND post_date < NOW() - INTERVAL %d DAY",
    $days
));
echo 'Отложенных заказов старше ' . $days . ' дней: ' . count($results);

Пошаговое решение: автоматическое отключение отложенных оплат

1. Создаем WP-Cron задачу для регулярной проверки

WP-Cron позволяет запускать задачи по расписанию без внешнего планировщика. Добавим хук для ежедневной проверки и отключения отложенных оплат, просроченных по времени.

add_action('wp_loaded', function() {
    if (!wp_next_scheduled('auto_cancel_expired_on_hold_orders')) {
        wp_schedule_event(time(), 'daily', 'auto_cancel_expired_on_hold_orders');
    }
});

2. Функция отмены просроченных заказов

Определим функцию, которая будет искать заказы в статусе on-hold или pending, старше заданного срока, и менять их статус на cancelled (отменён).

add_action('auto_cancel_expired_on_hold_orders', function() {
    $days = 14; // срок в днях
    $date = (new DateTime())->modify("-{$days} days")->format('Y-m-d H:i:s');

    $args = [
        'limit' => -1,
        'status' => ['on-hold', 'pending'],
        'date_created' => '<' . $date,
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        $order->update_status('cancelled', 'Автоматическая отмена просроченного отложенного заказа.');
    }
});

3. Добавляем опцию для настройки срока в днях

Чтобы можно было менять время без правки кода, добавим настройку в админку. Например, через add_option и простую страницу настроек или через Customizer.

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

1. Создайте заказ с статусом on-hold или pending с датой создания более 14 дней назад (можно вручную изменить в базе для теста).

2. Запустите вручную крон-задачу:

do_action('auto_cancel_expired_on_hold_orders');

3. Проверьте статус заказа — он должен измениться на cancelled.

4. В реальном режиме подождите следующий ежедневный запуск или настройте интервал для теста.

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

  • Задача WP-Cron не запускается: Проверьте, что на сайте есть трафик и не отключен WP-Cron. Для теста вызовите вручную do_action('auto_cancel_expired_on_hold_orders');.
  • Неверный формат даты при поиске заказов: Используйте стандартный формат Y-m-d H:i:s в параметрах запроса.
  • Заказы не меняют статус: Убедитесь, что у вас есть права на изменение заказов и что WooCommerce активен.
  • Отмена заказа приводит к потере данных: Статус cancelled не удаляет заказ, а лишь помечает его отменённым. Если нужно удалить, реализуйте отдельный процесс.

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

  • Безопасность: Не используйте прямой SQL для обновления статусов, пользуйтесь API WooCommerce (WC_Order::update_status()), чтобы сохранить логи и триггеры.
  • Производительность: При большом количестве заказов используйте постраничную выборку (пагинацию) в wc_get_orders — параметр limit и offset.
  • Логирование: Добавьте логирование автоматических изменений в файл или системный лог для отладки и аудита.
  • Настраиваемость: Сделайте срок просрочки настраиваемым через админку, чтобы подстраиваться под бизнес-процессы.

Сравнение подходов: плагин vs код vs ручное управление

МетодПлюсыМинусыКомпромисс
Плагин (напр. WooCommerce Order Status Manager)Простая настройка, UI для управленияДополнительная нагрузка, возможные конфликтыИспользовать проверенные плагины с хорошими отзывами
Код (как в статье)Легковесно, гибко, полный контрольТребует навыков, возможно ошибкиИспользовать в сочетании с логированием и тестами
Ручное управлениеПросто, без изменений кодаЗатратно по времени, риск забытьИспользовать для малого количества заказов
WooCommerce: как автоматически исключать товары из каталога при отсутствии на складе
20.05.2026
Как удалить по умолчанию скрипты и стили в WooCommerce для ускорения сайта
04.05.2026
WooCommerce: как автоматически отключать отложенные оплаты при превышении срока
29.05.2026
Как использовать WPCommunity для создания собственного форума на WordPress
26.03.2026
Как использовать фильтры WooCommerce для изменения цены товара на лету
28.04.2026