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

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

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

Для диагностики первой проблемы:
— Проверьте, как долго заказы находятся в статусе ожидания оплаты.
— Определите, какие платежные методы чаще всего вызывают задержки.
— Убедитесь, что статусы заказов корректно обновляются в момент оплаты или отмены.

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

SELECT post_id, meta_value AS payment_method, post_date, post_status
FROM wp_posts
JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
WHERE post_type = 'shop_order'
  AND post_status IN ('wc-pending', 'wc-on-hold')
  AND meta_key = '_payment_method'
ORDER BY post_date ASC;

Данный запрос выведет заказы в статусах ожидания и на удержании с указанием платежного метода и даты создания.

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

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

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

function wplike_auto_cancel_unpaid_orders() {
    if ( ! class_exists( 'WC_Order' ) ) {
        return;
    }

    $payment_methods_to_check = array(
        'bacs',       // Оплата по банковскому переводу
        'cheque',     // Чек
        'cod',        // Наложенный платеж
        'paypal',     // PayPal
        'stripe',     // Stripe
        // Добавьте свои платежные методы здесь
    );

    $time_limits = array(
        'bacs'   => 48 * HOUR_IN_SECONDS,  // 48 часов
        'cheque' => 72 * HOUR_IN_SECONDS,  // 72 часа
        'cod'    => 24 * HOUR_IN_SECONDS,  // 24 часа
        'paypal' => 12 * HOUR_IN_SECONDS,  // 12 часов
        'stripe' => 12 * HOUR_IN_SECONDS,  // 12 часов
    );

    $args = array(
        'limit' => -1,
        'status' => array('pending', 'on-hold'),
        'payment_method' => $payment_methods_to_check,
        'date_created' => '<' . (time() - max($time_limits)),
    );

    $orders = wc_get_orders($args);

    foreach ( $orders as $order ) {
        $payment_method = $order->get_payment_method();
        $order_date = $order->get_date_created()->getTimestamp();
        $now = time();

        if ( isset($time_limits[$payment_method]) ) {
            $limit = $time_limits[$payment_method];
            if (($now - $order_date) > $limit) {
                if (!in_array($order->get_status(), array('cancelled', 'completed', 'refunded'))) {
                    $order->update_status('cancelled', 'Автоматическая отмена заказа из-за отсутствия оплаты по методу ' . $payment_method);
                }
            }
        }
    }
}
add_action('woocommerce_scheduled_sales', 'wplike_auto_cancel_unpaid_orders');

2. Настраиваем Cron для регулярного запуска проверки

Для автоматического выполнения функции добавим собственное событие WP-Cron:

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

add_action( 'wplike_cancel_unpaid_orders_hook', 'wplike_auto_cancel_unpaid_orders' );

Этот код запустит проверку каждый час.

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

  • Создайте тестовый заказ с выбранным платежным методом.
  • Оставьте его неоплаченным и установите дату создания заказа в прошлом (можно через базу данных или WP-CLI).
  • Запустите вручную WP-Cron или дождитесь автоматического запуска.
  • Проверьте, что статус заказа изменился на «Отменён».
  • Просмотрите логи или комментарии к заказу — там должно появиться сообщение об автоматической отмене.

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

  • Заказы не отменяются: Убедитесь, что WP-Cron работает корректно на сервере. Для проверки можно использовать плагин WP Crontrol.
  • Некорректные payment_method: Проверьте точное значение ключа _payment_method в базе данных, возможно, оно отличается от ожидаемого.
  • Функция не вызывается: Проверьте, что файл с кодом подключён и нет синтаксических ошибок.
  • Статусы заказов не меняются: Проверьте, что у пользователя сайта достаточно прав на изменение статусов заказов.

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

  • Используйте wc_get_orders с ограничением по дате и статусу, чтобы не перегружать сервер.
  • Ограничивайте количество проверяемых платежных методов и период проверки, чтобы избежать излишней нагрузки.
  • Для больших магазинов рассмотрите использование систем внешнего планировщика задач (например, системного cron), чтобы повысить надежность.
  • Всегда делайте резервное копирование перед внесением изменений в функционал.

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

МетодПреимуществаНедостатки
Ручное удаление через админкуПростотаТрудозатратно, риск ошибок
Плагины для отмены заказовУдобство, готовые настройкиМогут замедлять сайт, лишний код
Кастомный код с WP-CronГибкость, контроль, легковесностьНужны навыки разработки, настройка cron
Как создать собственный шорткод в WordPress
31.10.2025
WooCommerce: автоматическое удаление заказов без оплаты через заданный период
26.06.2026
WooCommerce: автоматическое изменение статуса заказа по успешному платежу
12.05.2026
Как отключить редактор Gutenberg в WordPress
01.02.2026
Как автоматизировать работу с изображениями в WordPress
25.11.2025