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

Почему важно автоматически отменять неоплаченные заказы в WooCommerce?

В интернет-магазинах на WooCommerce нередко накапливаются неоплаченные заказы — клиенты оформляют заказ, но не завершают оплату. Это приводит к «зависанию» товаров в заказах, блокируя их для других покупателей и искажая статистику продаж. Автоматическая отмена таких заказов позволяет поддерживать актуальность данных, освобождает склад и снижает нагрузку на администраторов.

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

Чтобы понять, нужно ли автоматизировать отмену, проверьте следующие моменты:

  • Сколько заказов в вашем WooCommerce находятся в статусе on-hold или pending дольше 24-48 часов.
  • Используется ли у вас плагин оплаты, который не меняет статус автоматически после неудачной оплаты.
  • Отсутствуют ли уведомления для админа о неоплаченных заказах.

Для быстрой проверки можно использовать SQL-запрос в базе данных:

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

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

Пошаговое решение: автоматическая отмена заказов через WP-Cron

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

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

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

2. Основная функция отмены заказов

add_action('cancel_unpaid_orders_daily_event', 'cancel_unpaid_orders');
function cancel_unpaid_orders() {
    $args = array(
        'limit' => -1,
        'status' => array('pending', 'on-hold'),
        'date_created' => '<' . (time() - 24 * HOUR_IN_SECONDS),
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        // Меняем статус заказа на отмененный
        $order->update_status('cancelled', 'Заказ автоматически отменён из-за неоплаты более 24 часов.');
    }
}

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

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

Как проверить, что автоматизация работает

  • Создайте тестовый заказ со статусом pending или on-hold.
  • Вручную измените дату создания заказа в базе данных, чтобы она была старше 24 часов (через phpMyAdmin или WP CLI).
  • Вызовите Cron-задачу вручную с помощью плагина WP Crontrol или через WP CLI: wp cron event run cancel_unpaid_orders_daily_event.
  • Проверьте, что статус заказа изменился на cancelled и в комментариях заказа появилась запись об автоматической отмене.

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

  • Крон-задача не запускается: убедитесь, что на сайте включён WP-Cron (параметр DISABLE_WP_CRON не установлен в true), и что есть посещения сайта для активации Cron.
  • Неверный выбор заказов: в функции wc_get_orders важно правильно указать date_created через массив или строку. В нашем примере мы используем строку с оператором <, что поддерживается с WooCommerce 3.0+. Если не работает, можно использовать фильтрацию вручную.
  • Заказы не меняют статус: проверьте, что у пользователя, под которым работает Cron, есть права на редактирование заказов и что нет конфликтов с другими плагинами.

Чек-лист внедрения автоматической отмены заказов

  1. Добавлен и активирован код с Cron-задачей.
  2. Проверена корректность выбора статусов и времени.
  3. Проведено тестирование на тестовом заказе.
  4. Проверена работа Cron через WP Crontrol или WP CLI.
  5. Обеспечена очистка Cron при деактивации плагина/темы.

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

  • Ограничьте частоту запуска Cron для снижения нагрузки — например, ежедневно, как в примере.
  • Логи изменений можно направлять в отдельный файл или использовать встроенный лог WooCommerce для аудита.
  • Не изменяйте статус заказов автоматически без проверки времени — это может привести к отмене актуальных заказов.
  • При больших объемах заказов используйте постраничную обработку (пагинацию) вместо загрузки всех заказов за раз.

Альтернативы: плагины или кастомный код?

МетодПреимуществаНедостатки
Код, как в статьеПолный контроль, нет дополнительных плагинов, легкий и настраиваемыйТребуется базовые знания PHP и Cron, может не подойти для очень больших магазинов
Плагины (например, WooCommerce Cancel Abandoned Order)Готовое решение, с настройками из админки, поддержка обновленийМожет быть избыточным, нагрузка, зависимость от сторонних разработчиков
WooCommerce: автоматическая отмена неоплаченных заказов с помощью кода
01.08.2026
Как изменить метаданные для оценки статьи в WordPress
25.02.2026
Изменение URL для AJAX-запросов в WordPress без перезагрузки страницы
11.12.2025
Как разделить длинные посты на страницы в WordPress
13.03.2026
Как удалить пустые категории в WordPress: эффективные методы и примеры кода
25.12.2025