Диагностика проблемы: почему важно отключать неактивные подписки
В интернет-магазинах на 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, возможны ошибки при неправильной реализации |
| Плагины для управления подписками | Использование дополнительного плагина с функциями автоматизации | Готовые решения, поддержка | Может быть избыточным, требует обновлений |