Диагностика задачи: зачем автоматизировать отключение подписок и удаление пользователей
В WooCommerce с подписками часто возникает задача: при отмене подписки нужно не только отключить её, но и автоматически удалить пользователя, если он больше не нужен. Это актуально для сервисов с ограниченным числом пользователей или когда подписка — единственный критерий доступа.
Без автоматизации администратору приходится вручную искать пользователей с отменёнными подписками и удалять их, что неудобно и может привести к ошибкам.
Пошаговое решение: настройка автоматического отключения подписки и удаления пользователя
1. Отслеживаем событие отмены подписки
WooCommerce Subscriptions генерирует хук woocommerce_subscription_status_cancelled, который срабатывает при отмене подписки. Используем его для запуска нашей логики.
2. Получаем ID пользователя и удаляем его
Подписка содержит ID пользователя. Проверяем, есть ли у пользователя другие активные подписки, чтобы не удалять лишнего.
add_action('woocommerce_subscription_status_cancelled', 'auto_delete_user_on_subscription_cancel', 10, 1);
function auto_delete_user_on_subscription_cancel($subscription) {
$user_id = $subscription->get_user_id();
if (!$user_id) {
return; // Нет пользователя - выходим
}
// Проверяем, есть ли у пользователя другие активные подписки
$user_subscriptions = wcs_get_users_subscriptions($user_id);
foreach ($user_subscriptions as $sub) {
if ($sub->has_status('active')) {
return; // Есть активные подписки - не удаляем
}
}
// Удаляем пользователя и его данные
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}3. Резервное уведомление администратора (опционально)
Перед удалением рекомендуется отправить уведомление администратору для контроля.
add_action('woocommerce_subscription_status_cancelled', 'notify_admin_before_user_deletion', 9, 1);
function notify_admin_before_user_deletion($subscription) {
$user_id = $subscription->get_user_id();
if (!$user_id) return;
$user_info = get_userdata($user_id);
$to = get_option('admin_email');
$subject = 'Пользователь будет удалён после отмены подписки';
$message = "Пользователь {$user_info->user_login} (ID: {$user_id}) отменил подписку и будет удалён, если нет других активных подписок.";
wp_mail($to, $subject, $message);
}Проверка результата после внедрения
- Создайте тестового пользователя и оформите подписку через WooCommerce Subscriptions.
- Отмените подписку через аккаунт пользователя или админку.
- Проверьте, что пользователь удалён из базы данных (через wp-admin или phpMyAdmin).
- Убедитесь, что уведомление пришло на email администратора (если включено).
- Проверьте, что при наличии нескольких подписок у пользователя удаление не происходит.
Частые ошибки и как их исправить
- Пользователь не удаляется после отмены подписки
Проверьте, что подключен и активен плагин WooCommerce Subscriptions и что хукwoocommerce_subscription_status_cancelledсрабатывает. Для отладки добавьтеerror_logвнутри функции. - Удаляются пользователи с активными подписками
Проверьте логику проверки активных подписок. Используйте функциюwcs_get_users_subscriptionsи методhas_status('active')корректно. - Email уведомление не отправляется
Убедитесь, что функцияwp_mailнастроена и почта с сайта отправляется (тест через плагин WP Mail SMTP или аналогичный). - Ошибка прав доступа при удалении пользователей
Функцияwp_delete_userдолжна вызываться в контексте с правами администратора. Если код в плагине, проверьте, что пользователь с нужными правами запускает процесс.
Практические советы по безопасности и производительности
- Перед удалением пользователя лучше создавать резервные копии базы данных, особенно если процесс автоматизирован.
- Добавьте логирование действий удаления в отдельную таблицу или файл для аудита.
- Если у вас большой трафик и подписок много, используйте WP-Cron или внешние cron-задачи для периодической проверки отменённых подписок и удаления пользователей, чтобы не нагружать сайт при каждом событии.
- Для защиты от случайного удаления добавьте дополнительный флаг в метаданные пользователя, например
pending_deletion, который устанавливается при отмене подписки и подтверждается отдельно.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Автоматическое удаление по хуку отмены подписки | Простая реализация, срабатывает сразу | Риск удаления нужных пользователей, если логика не точна | Подходит для простых сайтов с единичной подпиской |
| Отложенное удаление с меткой и отдельным cron-заданием | Более безопасно, можно вручную отменить удаление | Сложнее в реализации и поддержке | Крупные проекты с большим количеством пользователей |
| Удаление вручную через админ-панель с фильтром по статусу подписки | Максимальный контроль, нет риска ошибочного удаления | Требует ручной работы | Для проектов с небольшим числом подписчиков |