Диагностика проблемы с неуплаченными платежами в подписках WooCommerce
В интернет-магазинах на WooCommerce, использующих подписки (через плагин WooCommerce Subscriptions), часто возникает ситуация, когда платеж по подписке не проходит (например, из-за проблем с картой или недостатка средств). Если не настроить автоматическое отключение таких подписок, клиент продолжит иметь доступ к сервису, несмотря на неоплату, что ведёт к потере дохода и сложностям в учёте.
Проверить наличие таких подписок можно через админку WooCommerce в разделе Подписки, фильтруя по статусу active, но с отсутствующими успешными платежами за последний период.
Как определить неуплаченные подписки программно
Вы можете получить список подписок, у которых последний платеж не был успешным или просрочен, с помощью WP_Query и метаданных заказов:
$args = [
'post_type' => 'shop_subscription',
'post_status' => 'wc-active',
'meta_query' => [
[
'key' => '_last_payment_failed',
'value' => '1',
'compare' => '='
]
]
];
$failed_subscriptions = get_posts($args);Если у вас нет мета _last_payment_failed, придется проверять даты последних платежей вручную, анализируя связанные заказы.
Пошаговое решение: автоматическое отключение подписок при неуплаченном платеже
1. Создание WP-Cron задачи для проверки подписок
Добавим в functions.php или отдельный плагин следующий код, который будет запускаться ежедневно и проверять подписки:
add_action('wppay_check_failed_subscriptions', 'wppay_disable_failed_subscriptions');
function wppay_disable_failed_subscriptions() {
$args = [
'post_type' => 'shop_subscription',
'post_status' => 'wc-active',
'posts_per_page' => -1
];
$subscriptions = get_posts($args);
foreach ($subscriptions as $subscription_post) {
$subscription = wcs_get_subscription($subscription_post->ID);
if (!$subscription) continue;
// Получаем дату следующего платежа
$next_payment_date = $subscription->get_date('next_payment');
if (!$next_payment_date) continue; // Нет следующего платежа
$now = current_time('timestamp');
$next_payment_ts = strtotime($next_payment_date);
// Если дата следующего платежа в прошлом (просрочена больше суток)
if ($next_payment_ts < $now - DAY_IN_SECONDS) {
// Проверяем статус последнего платежа
$last_order = $subscription->get_last_order();
if ($last_order && $last_order->get_status() !== 'completed') {
// Меняем статус подписки на отменённый
$subscription->update_status('cancelled', 'Автоматическое отключение подписки из-за неуплаченного платежа.');
}
}
}
}
// Добавляем ежедневное событие
if (!wp_next_scheduled('wppay_check_failed_subscriptions')) {
wp_schedule_event(time(), 'daily', 'wppay_check_failed_subscriptions');
}2. Очистка CRON при деактивации
register_deactivation_hook(__FILE__, function() {
$timestamp = wp_next_scheduled('wppay_check_failed_subscriptions');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wppay_check_failed_subscriptions');
}
});Проверка результата после внедрения
- Настройте тестовую подписку с просроченным платежом (можно вручную изменить дату следующего платежа в БД для теста).
- Запустите CRON вручную через WP-CLI:
wp cron event run wppay_check_failed_subscriptions. - Проверьте, что статус подписки изменился на
cancelledв админке WooCommerce. - Убедитесь, что пользователю недоступен доступ по подписке.
Частые ошибки и их исправление
- CRON не срабатывает: проверьте, что WP-Cron работает (обычно вызывается при посещениях сайта). При необходимости настройте системный cron на вызов
wp-cron.php. - Подписки не меняют статус: убедитесь, что используете правильные методы из WooCommerce Subscriptions API и что у пользователя права для изменения статуса.
- Неправильная логика проверки платежей: не полагайтесь только на даты, проверяйте статусы последних заказов подписки.
Практические советы по безопасности и производительности
- Ограничьте количество подписок, проверяемых за один запуск, если их много, чтобы избежать тайм-аутов.
- Добавьте логику оповещения администраторов о массовых отключениях подписок.
- Используйте nonce и проверку прав доступа при добавлении административных функций для управления подписками.
- Рекомендуется использовать плагин Clearfy Pro для оптимизации работы WooCommerce и очистки базы данных от устаревших записей, что улучшит производительность.
Сравнение способов автоматического отключения подписок
| Способ | Описание | Преимущества | Недостатки |
|---|---|---|---|
| WP-Cron с пользовательской функцией | Проверка подписок и смена статуса через свой код | Гибкость, можно адаптировать под свои условия | Зависит от работы WP-Cron, требует поддержки кода |
| Плагины автоматизации WooCommerce Subscriptions | Готовые решения с настройками | Простота использования, поддержка | Может быть платным, ограничена кастомизация |
| Ручная проверка и отключение | Администратор вручную меняет статусы | Простая реализация без кода | Трудозатратно, не подходит для большого объема |