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

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

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

Типичные признаки проблемы:

  • Подписки с истекшим сроком, которые не отменяются автоматически;
  • Отсутствие уведомлений об окончании подписки;
  • Ручное управление подписками занимает много времени;
  • Пользователи жалуются на списания после фактического окончания подписки.

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

1. Определяем критерии неактивности

Например, отключать подписки, если статус "on-hold" или "pending cancellation" длится более 30 дней.

2. Используем WP-CRON для регулярной проверки

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

function wppay_deactivate_expired_subscriptions() {
    if ( ! class_exists( 'WC_Subscriptions_Manager' ) ) {
        return;
    }

    $args = array(
        'subscriptions_per_page' => -1,
        'subscription_status'    => array( 'on-hold', 'pending-cancel' ),
        'orderby'               => 'modified',
        'order'                 => 'ASC',
    );

    $subscriptions = wcs_get_subscriptions( $args );
    $now = time();

    foreach ( $subscriptions as $subscription ) {
        $last_modified = strtotime( $subscription->get_date_modified() );
        $days_inactive = ( $now - $last_modified ) / DAY_IN_SECONDS;

        if ( $days_inactive > 30 ) {
            // Автоматическое отменение подписки
            $subscription->update_status( 'cancelled', 'Автоматическое отключение по истечении срока неактивности' );
        }
    }
}
add_action( 'wppay_daily_subscription_check', 'wppay_deactivate_expired_subscriptions' );

// Планируем ежедневное событие при активации темы/плагина
function wppay_schedule_daily_subscription_check() {
    if ( ! wp_next_scheduled( 'wppay_daily_subscription_check' ) ) {
        wp_schedule_event( time(), 'daily', 'wppay_daily_subscription_check' );
    }
}
add_action( 'wp', 'wppay_schedule_daily_subscription_check' );

3. Проверяем работоспособность расписания WP-CRON

Для проверки используйте плагин WP Crontrol, чтобы увидеть и вручную запускать задачу wppay_daily_subscription_check.

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

  • Проверьте список подписок с помощью wcs_get_subscriptions, что все с неактивным статусом и сроком больше 30 дней переведены в статус cancelled.
  • Запустите вручную CRON-задачу через WP Crontrol и убедитесь, что в логах нет ошибок.
  • Проверьте, что пользователи с отключенными подписками не получают списания.

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

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

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

  • Не используйте слишком частое выполнение CRON-задачи, чтобы не нагружать сервер.
  • Добавьте логирование действий для отслеживания отключений:
    error_log( 'Subscription ID ' . $subscription->get_id() . ' cancelled automatically.' );
  • Ограничьте выбор подписок в запросе, если база большая, чтобы избежать таймаутов.
  • Проверяйте доступность плагина WooCommerce Subscriptions перед выполнением кода.

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

МетодОписаниеПлюсыМинусы
Ручное отключениеАдминистратор вручную меняет статус подписокПолный контрольТрудоемко, риск ошибок
Автоматизация через WP-CRONПериодическая проверка и отключение подписок по срокамЭкономит время, снижает нагрузкуНужна настройка CRON, возможны ошибки при неправильной реализации
Плагины для управления подпискамиИспользование дополнительного плагина с функциями автоматизацииГотовые решения, поддержкаМожет быть избыточным, требует обновлений
Как создать настраиваемый платежный плагин для WordPress
26.01.2026
Обновление платежных плагинов в WordPress без потери данных
02.01.2026
WooCommerce: как автоматически отключать неактивные подписки
15.05.2026
Как создать автоплатёж с повтором в WordPress
20.03.2026
Как использовать Redis для кэширования платежных запросов в WordPress
27.03.2026