Диагностика задачи: зачем автоматизировать удаление пользователя при отмене подписки
В интернет-магазинах на WooCommerce с подписками часто возникает необходимость автоматически отключать подписку и удалять учетную запись пользователя при отмене услуги. Это помогает поддерживать базу клиентов в актуальном состоянии, снижает нагрузку на сервер и предотвращает несанкционированный доступ после прекращения подписки.
Типичные признаки, что нужна автоматизация:
- Много отмен подписок, требующих ручного удаления пользователей.
- Проблемы с безопасностью из-за оставшихся активных аккаунтов без подписок.
- Необходимость оптимизации процессов поддержки и учета пользователей.
Как отследить отмену подписки в WooCommerce
Отмена подписки в WooCommerce Subscriptions фиксируется через действие woocommerce_subscription_status_updated. Подписка имеет статусы: active, on-hold, cancelled и другие. Нам интересен переход статуса на cancelled.
Пример отслеживания отмены подписки:
add_action('woocommerce_subscription_status_updated', 'check_subscription_status_cancelled', 10, 3);function check_subscription_status_cancelled($subscription, $new_status, $old_status) { if ($new_status === 'cancelled') { // логика отключения и удаления пользователя }}Пошаговое решение: автоматическое отключение подписки и удаление пользователя
1. Отслеживаем отмену подписки
Добавляем хук, который реагирует на изменение статуса подписки:
add_action('woocommerce_subscription_status_updated', 'auto_delete_user_on_subscription_cancel', 10, 3);function auto_delete_user_on_subscription_cancel($subscription, $new_status, $old_status) { if ($new_status === 'cancelled') { $user_id = $subscription->get_user_id(); if ($user_id) { // отключаем подписку (на всякий случай) $subscription->update_status('cancelled'); // удаляем пользователя require_once ABSPATH . 'wp-admin/includes/user.php'; wp_delete_user($user_id); } }}2. Проверка безопасности
Перед удалением убедитесь, что пользователь не имеет других активных подписок или покупок, чтобы не потерять лояльного клиента ошибочно.
Добавим проверку:
function has_active_subscriptions($user_id) { $subscriptions = wcs_get_users_subscriptions($user_id); foreach ($subscriptions as $subscription) { if ($subscription->has_status('active')) { return true; } } return false;}И используем её перед удалением:
if ($user_id && !has_active_subscriptions($user_id)) { wp_delete_user($user_id);}Проверка результата после внедрения
Чтобы проверить, что автоматизация работает:
- Создайте тестового пользователя и оформите подписку.
- Отмените подписку через личный кабинет или админку WooCommerce.
- Проверьте, что подписка получает статус
cancelled. - Проверьте, что пользователь удален из базы (через wp-admin или базу данных).
- Убедитесь, что при наличии других активных подписок пользователь не удаляется.
Частые ошибки и их исправление
- Ошибка: Пользователь не удаляется после отмены подписки.
Причина: Отсутствует проверка статуса подписки или неправильный хук.
Решение: Убедитесь в использованииwoocommerce_subscription_status_updatedи проверке статусаcancelled. - Ошибка: Пользователь удаляется, хотя у него есть другие активные подписки.
Причина: Отсутствие проверки на наличие других активных подписок.
Решение: Добавьте проверку черезwcs_get_users_subscriptionsперед удалением. - Ошибка: Ошибка при удалении пользователя из-за отсутствия подключения
wp-admin/includes/user.php.
Решение: Добавьтеrequire_once ABSPATH . 'wp-admin/includes/user.php';перед вызовомwp_delete_user().
Практические советы по безопасности и производительности
- Резервное копирование: Перед автоматическим удалением пользователей сделайте резервное копирование базы данных, чтобы избежать потери данных.
- Логирование действий: Записывайте события удаления пользователей в отдельный лог для аудита и восстановления при необходимости.
- Оптимизация вызовов: Используйте кэширование и минимизируйте вызовы к базе при проверках подписок, особенно при большом количестве пользователей.
- Тестирование на staging-сервере: Перед внедрением на живом сайте протестируйте код на тестовой среде.
Сравнение вариантов реализации
| Вариант | Плюсы | Минусы |
|---|---|---|
| Ручное удаление пользователей | Простота, контроль | Высокая нагрузка, ошибки, задержки |
| Автоматизация через хук WooCommerce Subscriptions | Экономия времени, надежность, безопасность | Требует тестирования, возможны ошибки при некорректном коде |
| Использование сторонних плагинов | Готовые решения, поддержка | Зависимость от разработчика, нагрузка, стоимость |