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

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

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

Диагностика: как определить, что подписка неактивна

Для начала важно понять, что считать «неактивной» подпиской. Чаще всего это подписки, у которых:

  • статус "on-hold" или "pending-cancel" длится более установленного времени (например, 30 дней);
  • нет оплаты или обновления данных в течение заданного срока;
  • пользователь не совершал активных действий (например, не входил в аккаунт, не обновлял данные).

В WooCommerce Subscriptions есть стандартные статусы подписок, доступные через API и базу данных: wcs_get_subscriptions() для получения списка, $subscription->get_status() для статуса.

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

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

function wppay_disable_inactive_subscriptions() {
    $days_inactive = 30; // Порог неактивности в днях
    $subscriptions = wcs_get_subscriptions( array(
        'subscription_status' => array('on-hold', 'pending-cancel'),
    ));

    foreach ( $subscriptions as $subscription ) {
        $last_payment = $subscription->get_date( 'last_payment' );
        if ( ! $last_payment ) {
            // Если оплата никогда не была, берем дату создания
            $last_payment = $subscription->get_date_created();
        }

        $last_payment_time = strtotime( $last_payment );
        $current_time = current_time( 'timestamp' );
        $diff_days = ( $current_time - $last_payment_time ) / DAY_IN_SECONDS;

        if ( $diff_days >= $days_inactive ) {
            // Меняем статус на cancelled
            $subscription->update_status( 'cancelled', 'Автоматическое отключение из-за неактивности' );
        }
    }
}

2. Добавляем хук для запуска проверки по CRON

add_action( 'wppay_daily_subscription_check', 'wppay_disable_inactive_subscriptions' );

// Планируем задачу, если еще не запланирована
if ( ! wp_next_scheduled( 'wppay_daily_subscription_check' ) ) {
    wp_schedule_event( time(), 'daily', 'wppay_daily_subscription_check' );
}

3. Как отменить задачу (при необходимости)

$timestamp = wp_next_scheduled( 'wppay_daily_subscription_check' );
if ( $timestamp ) {
    wp_unschedule_event( $timestamp, 'wppay_daily_subscription_check' );
}

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

  • Запустите функцию вручную, вызвав wppay_disable_inactive_subscriptions(); из консоли WP-CLI или файла темы, чтобы проверить логику.
  • Проверьте в админке WooCommerce > Подписки, что подписки с длительной неактивностью сменили статус на "Cancelled".
  • Просмотрите системные логи ошибок или добавьте логирование в функцию для отладки.

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

  • Подписки не меняют статус — Проверьте, что плагин WooCommerce Subscriptions активен и версии API совместимы.
  • CRON-задача не запускается — Убедитесь, что WP-Cron работает (например, посетите сайт, чтобы триггерить событие). Для надежности можно настроить системный cron на сервере.
  • Функция отключает подписки преждевременно — Проверьте правильность вычисления даты последней оплаты, убедитесь, что таймзоны совпадают.

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

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

Сравнение вариантов реализации

Метод Плюсы Минусы Когда использовать
WP-Cron и PHP-скрипт Простой в реализации, не требует сторонних сервисов Зависит от посещаемости сайта, возможны задержки Маленькие и средние сайты с регулярным трафиком
Системный cron + WP-CLI Максимальная надежность и контроль Требует доступа к серверу и навыков работы с консолью Крупные проекты, высокие требования к стабильности
Плагины автоматизации подписок Готовые решения, поддержка обновлений Может быть дорого, не всегда настраивается под нужды Быстрое внедрение без разработки
Автоматизация управления возвратами в WordPress для платежных систем
26.01.2026
Как использовать Redis для кэширования платежных запросов в WordPress
27.03.2026
Как создать автоматическую отчетность по платежам в WordPress
26.12.2025
Как создать автоматический отчёт по платежам в WordPress с помощью вебхуков
09.02.2026
Как автоматизировать управление возвратами в WordPress
22.02.2026