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

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

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

Основные признаки неактивной подписки:

  • Отсутствие платежей в течение определённого периода (например, 3 месяца).
  • Статус подписки остался "active", но платежный метод не используется.
  • Подписка не обновлялась клиентом, нет активности со стороны пользователя.

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

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

Ниже пример функции, которая ищет подписки с последним платежом старше 90 дней и меняет их статус на "cancelled".

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

    $args = array(
        'post_type'      => 'shop_subscription',
        'posts_per_page' => -1,
        'post_status'    => 'wc-active',
        'fields'         => 'ids',
    );

    $subscriptions = get_posts( $args );
    $now = time();
    $inactive_days_limit = 90; // В днях

    foreach ( $subscriptions as $subscription_id ) {
        $subscription = wcs_get_subscription( $subscription_id );
        if ( ! $subscription ) {
            continue;
        }

        $last_payment = $subscription->get_date( 'last_payment' );
        if ( ! $last_payment ) {
            continue;
        }

        $last_payment_timestamp = strtotime( $last_payment );
        $days_inactive = ( $now - $last_payment_timestamp ) / DAY_IN_SECONDS;

        if ( $days_inactive > $inactive_days_limit ) {
            $subscription->update_status( 'cancelled', 'Автоматическое отключение неактивной подписки после 90 дней без платежей' );
        }
    }
}

2. Регистрируем WP-Cron событие для регулярного запуска

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

add_action( 'wppay_daily_check_inactive_subscriptions', 'wppay_deactivate_inactive_subscriptions' );

function wppay_schedule_daily_inactive_check() {
    if ( ! wp_next_scheduled( 'wppay_daily_check_inactive_subscriptions' ) ) {
        wp_schedule_event( time(), 'daily', 'wppay_daily_check_inactive_subscriptions' );
    }
}
add_action( 'wp', 'wppay_schedule_daily_inactive_check' );

3. Очистка планировщика при деактивации темы или плагина

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

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

  • Перейдите в админку WooCommerce > Подписки.
  • Проверьте, что подписки с последним платежом старше 90 дней имеют статус "Отменена".
  • Для теста можно временно уменьшить лимит дней в коде и запустить функцию вручную:
add_action( 'admin_init', function() {
    wppay_deactivate_inactive_subscriptions();
} );

После проверки код запускайте только через Cron, чтобы не нагружать сайт.

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

  • Подписки не меняют статус: проверьте, активен ли плагин WooCommerce Subscriptions и есть ли у подписок статус wc-active.
  • Функция не запускается по расписанию: убедитесь, что WP-Cron работает (например, посещайте сайт регулярно или настройте системный cron на вызов wp-cron.php).
  • Проблемы с временными зонами: используйте функции WordPress для работы с датами, чтобы учитывать временную зону сайта.
  • Ошибка при вызове wcs_get_subscription: функция доступна только при активном WooCommerce Subscriptions, проверьте подключение плагина.

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

  • Запускайте функцию деактивации только раз в сутки, чтобы не перегружать базу.
  • Учитывайте, что массовое обновление большого количества подписок может вызвать нагрузку — при большом каталоге реализуйте пакетную обработку.
  • Сохраняйте логи отключения подписок для отладки и аудита.
  • Используйте nonce и проверку прав, если добавляете возможность запуска функции вручную из админки.

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

ВариантПлюсыМинусы
WP-Cron + хук (код)Гибкость, автоматизация, контроль через кодНужно проверять работу cron, требует доступа к коду
Плагины для управления подпискамиГотовые настройки, поддержкаМогут быть тяжелыми, ограниченная кастомизация
Ручное отключениеПростотаРучной труд, риск забыть
WooCommerce: как настроить автопродление подписок через вебхуки
01.05.2026
Как вывести платежные данные WooCommerce в админке WordPress
18.04.2026
WooCommerce: как установить платежные лимиты по пользователям
12.06.2026
WooCommerce: автоматизация возврата и отмены заказов через вебхуки
07.07.2026
Оптимизация платежных запросов и уход за базой данных в WordPress
07.03.2026