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