WooCommerce: автоматическое отключение подписок при неуплаченных платежах

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

В интернет-магазинах на WooCommerce с подписками (например, с плагином WooCommerce Subscriptions) часто возникает ситуация, когда платеж по подписке не проходит (проблемы с картой, недостаточно средств и т.п.). По умолчанию такие подписки могут оставаться активными, что приводит к потере дохода и путанице в учете.

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

  • Перейдите в WooCommerce > Заказы.
  • Отфильтруйте заказы со статусом failed или pending.
  • Проверьте связанные с ними подписки — если подписка активна, несмотря на статус заказа, значит автоматического отключения нет.

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

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

1. Используем хук WooCommerce для отслеживания смены статуса заказа

При смене статуса заказа на failed или cancelled нужно программно деактивировать подписку.

2. Получаем подписку по заказу и меняем её статус

Ниже пример кода для файла functions.php вашей темы или в виде сниппета в кастомном плагине:

add_action('woocommerce_order_status_failed', 'disable_subscription_on_failed_payment', 10, 1);
add_action('woocommerce_order_status_cancelled', 'disable_subscription_on_failed_payment', 10, 1);

function disable_subscription_on_failed_payment($order_id) {
    if (!class_exists('WC_Subscriptions')) {
        return; // Плагин подписок не активен
    }

    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

    // Получаем все подписки, связанные с заказом
    $subscriptions = wcs_get_subscriptions_for_order($order_id);
    
    foreach ($subscriptions as $subscription) {
        // Проверяем, активна ли подписка
        if ($subscription->has_status('active')) {
            // Меняем статус на 'on-hold' или 'cancelled' по бизнес-логике
            $subscription->update_status('on-hold', 'Подписка поставлена на паузу из-за неудачного платежа.');
        }
    }
}

3. Дополнительный CRON для проверки и отключения просроченных подписок

Можно добавить периодический CRON, который проверяет подписки с неоплаченными платежами и ставит их в статус on-hold или cancelled. Это полезно, если платежи не меняют статус заказа своевременно.

if (!wp_next_scheduled('check_failed_subscriptions_cron')) {
    wp_schedule_event(time(), 'hourly', 'check_failed_subscriptions_cron');
}

add_action('check_failed_subscriptions_cron', 'check_and_disable_failed_subscriptions');

function check_and_disable_failed_subscriptions() {
    $args = array(
        'subscription_status' => 'active',
        'limit' => -1
    );

    $subscriptions = wcs_get_subscriptions($args);

    foreach ($subscriptions as $subscription) {
        $last_order = $subscription->get_last_order('all');
        if (!$last_order) {
            continue;
        }

        $status = $last_order->get_status();
        if (in_array($status, array('failed', 'cancelled', 'pending'))) {
            $subscription->update_status('on-hold', 'Автоматическая пауза из-за неоплаченного последнего платежа.');
        }
    }
}

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

  • Создайте тестовую подписку и оформите заказ с неуспешным платежом (например, тестовой картой с недостатком средств).
  • Перейдите в админку WooCommerce > Заказы и убедитесь, что статус заказа стал failed или cancelled.
  • Проверьте связанную подписку: её статус должен измениться на on-hold (или cancelled, если выбрали такой вариант).
  • Ожидайте работу CRON (если настроили), и проверьте, что подписки с неоплаченными платежами меняют статус автоматически.

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

  • Плагин WooCommerce Subscriptions не активен или не установлен. Вызовы функций подписок вернут ошибки или не сработают. Проверьте статус плагина.
  • Ошибки в хуках или неверные статусы заказов. Убедитесь, что вы используете правильные статусы заказа (например, failed, cancelled).
  • CRON не срабатывает. Проверьте запланированные события с помощью плагина WP Crontrol. Убедитесь, что на хостинге разрешен WP-CRON или настроен системный cron.
  • Подписки не меняют статус. Проверьте логи ошибок и права доступа, а также что у подписок действительно есть связанные заказы.

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

  • Запускайте тяжелые операции (например, проверку подписок) через CRON с лимитами и пагинацией, чтобы не нагружать сервер.
  • Используйте update_status с пояснением причины для прозрачности в логах.
  • Ограничьте доступ к функциям изменения статуса подписок только для доверенных администраторов.
  • При массовом обновлении подписок используйте транзакции и логирование для отката в случае ошибок.

Сравнение вариантов реализации автоматического отключения подписок

ВариантПлюсыМинусы
Хук смены статуса заказаМгновенное реагирование, простая реализацияНе сработает, если заказ статуса не меняется
Периодический CRONОбрабатывает «зависшие» подписки, не требует изменения статусов вручнуюЗадержка до запуска CRON, нагрузка при большом количестве подписок
Плагин с готовой логикойМинимум кода, поддержка и обновленияЗависимость от стороннего ПО, возможные ограничения
Как создать подписку на платные услуги в WordPress
16.11.2025
WooCommerce: как автоматически удалять зависшие платежи и избежать проблем в платежной системе
04.07.2026
Как настроить безопасные платежные формы в WordPress
21.12.2025
WooCommerce: как удалить зависшие платежи и избавиться от проблем в платежной системе
28.06.2026
Как установить лимит на платежи в WordPress по суммам и пользователям
14.03.2026