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