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

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

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

Проверить наличие таких подписок можно через админку WooCommerce в разделе Подписки, фильтруя по статусу active, но с отсутствующими успешными платежами за последний период.

Как определить неуплаченные подписки программно

Вы можете получить список подписок, у которых последний платеж не был успешным или просрочен, с помощью WP_Query и метаданных заказов:

$args = [
    'post_type' => 'shop_subscription',
    'post_status' => 'wc-active',
    'meta_query' => [
        [
            'key' => '_last_payment_failed',
            'value' => '1',
            'compare' => '='
        ]
    ]
];
$failed_subscriptions = get_posts($args);

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

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

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

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

add_action('wppay_check_failed_subscriptions', 'wppay_disable_failed_subscriptions');

function wppay_disable_failed_subscriptions() {
    $args = [
        'post_type' => 'shop_subscription',
        'post_status' => 'wc-active',
        'posts_per_page' => -1
    ];
    $subscriptions = get_posts($args);

    foreach ($subscriptions as $subscription_post) {
        $subscription = wcs_get_subscription($subscription_post->ID);
        if (!$subscription) continue;

        // Получаем дату следующего платежа
        $next_payment_date = $subscription->get_date('next_payment');
        if (!$next_payment_date) continue; // Нет следующего платежа

        $now = current_time('timestamp');
        $next_payment_ts = strtotime($next_payment_date);

        // Если дата следующего платежа в прошлом (просрочена больше суток)
        if ($next_payment_ts < $now - DAY_IN_SECONDS) {
            // Проверяем статус последнего платежа
            $last_order = $subscription->get_last_order();
            if ($last_order && $last_order->get_status() !== 'completed') {
                // Меняем статус подписки на отменённый
                $subscription->update_status('cancelled', 'Автоматическое отключение подписки из-за неуплаченного платежа.');
            }
        }
    }
}

// Добавляем ежедневное событие
if (!wp_next_scheduled('wppay_check_failed_subscriptions')) {
    wp_schedule_event(time(), 'daily', 'wppay_check_failed_subscriptions');
}

2. Очистка CRON при деактивации

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

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

  • Настройте тестовую подписку с просроченным платежом (можно вручную изменить дату следующего платежа в БД для теста).
  • Запустите CRON вручную через WP-CLI: wp cron event run wppay_check_failed_subscriptions.
  • Проверьте, что статус подписки изменился на cancelled в админке WooCommerce.
  • Убедитесь, что пользователю недоступен доступ по подписке.

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

  • CRON не срабатывает: проверьте, что WP-Cron работает (обычно вызывается при посещениях сайта). При необходимости настройте системный cron на вызов wp-cron.php.
  • Подписки не меняют статус: убедитесь, что используете правильные методы из WooCommerce Subscriptions API и что у пользователя права для изменения статуса.
  • Неправильная логика проверки платежей: не полагайтесь только на даты, проверяйте статусы последних заказов подписки.

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

  • Ограничьте количество подписок, проверяемых за один запуск, если их много, чтобы избежать тайм-аутов.
  • Добавьте логику оповещения администраторов о массовых отключениях подписок.
  • Используйте nonce и проверку прав доступа при добавлении административных функций для управления подписками.
  • Рекомендуется использовать плагин Clearfy Pro для оптимизации работы WooCommerce и очистки базы данных от устаревших записей, что улучшит производительность.

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

СпособОписаниеПреимуществаНедостатки
WP-Cron с пользовательской функциейПроверка подписок и смена статуса через свой кодГибкость, можно адаптировать под свои условияЗависит от работы WP-Cron, требует поддержки кода
Плагины автоматизации WooCommerce SubscriptionsГотовые решения с настройкамиПростота использования, поддержкаМожет быть платным, ограничена кастомизация
Ручная проверка и отключениеАдминистратор вручную меняет статусыПростая реализация без кодаТрудозатратно, не подходит для большого объема
Как установить лимит на платежи в WordPress по суммам и пользователям
14.03.2026
Как оптимизировать базы данных в WordPress для ускорения сайта
21.11.2025
WooCommerce: решение проблемы замедленного отключения неактивных подписок
17.07.2026
WooCommerce: как разрешить оплату в разных валютах с проверкой и настройкой
21.04.2026
WooCommerce: как реализовать авторизацию платежей через REST API для собственных приложений
29.05.2026