Диагностика задачи: зачем удалять пользователя при отмене подписки в WooCommerce
В WooCommerce подписка — это не просто товар, а способ регулярного взаимодействия с клиентом. Иногда возникает необходимость автоматически удалять аккаунт пользователя при отмене подписки, например, чтобы очистить базу от неактивных клиентов или по требованиям конфиденциальности. Стандартными средствами WooCommerce и WooCommerce Subscriptions такая логика не реализована, поэтому нужно создавать кастомное решение.
Как отследить отмену подписки: ключевые хуки WooCommerce Subscriptions
Для реализации удаления пользователя при отмене подписки нам нужно поймать событие отмены подписки. В WooCommerce Subscriptions для этого есть несколько хуков:
woocommerce_subscription_status_cancelled— срабатывает, когда подписка переходит в статус «cancelled»;woocommerce_subscription_status_expired— когда подписка истекла;woocommerce_subscription_status_on-hold— статус при приостановке.
Нам интересен именно первый — отмена подписки, поэтому используем woocommerce_subscription_status_cancelled.
Пошаговое решение: удаление пользователя при отмене подписки
1. Создаем функцию, которая по ID подписки получает пользователя и удаляет его.
2. Привязываем эту функцию к хуку woocommerce_subscription_status_cancelled.
3. Добавляем проверку, чтобы не удалять админов и пользователей с другими активными подписками.
add_action('woocommerce_subscription_status_cancelled', 'wpauth_delete_user_on_subscription_cancel', 10, 1);
function wpauth_delete_user_on_subscription_cancel($subscription) {
// Получаем ID пользователя
$user_id = $subscription->get_user_id();
// Проверяем, существует ли пользователь
$user = get_userdata($user_id);
if (!$user) {
return; // Пользователь не найден
}
// Не удаляем админов
if (in_array('administrator', $user->roles)) {
return;
}
// Проверяем, есть ли у пользователя другие активные подписки
$args = array(
'customer_id' => $user_id,
'status' => 'active',
'limit' => 1,
'return' => 'ids',
);
$subscriptions = wcs_get_subscriptions($args);
if (!empty($subscriptions)) {
return; // Есть другие активные подписки
}
// Удаляем пользователя вместе с данными
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}Объяснение кода
- Функция получает объект подписки из хука.
- По ID подписки берём ID пользователя.
- Проверяем роль пользователя — чтобы случайно не удалить администратора.
- Проверяем, есть ли у пользователя еще активные подписки — если есть, удалять нельзя.
- Удаляем пользователя с помощью
wp_delete_user().
Как проверить, что удаление пользователя работает
- Зарегистрируйте тестового пользователя и оформите подписку на сайте.
- В админке WooCommerce отмените эту подписку вручную.
- Проверьте, удалился ли пользователь через wp-admin → Пользователи.
- Если пользователь остался, посмотрите логи ошибок и активность хуков.
Частые ошибки и их исправление
- Пользователь не удаляется: Проверьте, подключен ли WooCommerce Subscriptions и правильно ли срабатывает хук. Для отладки добавьте
error_log()внутри функции. - Удаляются администраторы: В коде обязательно должна быть проверка роли пользователя
if (in_array('administrator', $user->roles)) return;. - Удаляются пользователи с другими активными подписками: Проверьте корректность вызова
wcs_get_subscriptions()и параметры фильтрации. - Ошибка при удалении пользователя: Убедитесь, что вызываете
require_once(ABSPATH . 'wp-admin/includes/user.php');передwp_delete_user().
Практические рекомендации по безопасности и производительности
- Используйте nonce и проверки прав, если вызываете удаление по Ajax или из фронтенда (если расширяете функционал).
- Удаление пользователя — необратимая операция. Делайте резервное копирование базы перед включением этого кода.
- Проверяйте, что скрипт не вызывает массовое удаление при ошибках — ограничьте его действие только нужными статусами.
- Для логирования действий можно добавить запись в системный лог или отдельную таблицу, чтобы отслеживать удаление пользователей.
Сравнение вариантов реализации удаления пользователей при отмене подписки
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
Кастомная функция на хук woocommerce_subscription_status_cancelled | Полный контроль, нет сторонних зависимостей | Нужно писать и тестировать код самому | Подробно в статье выше |
| Плагин автоматизации WooCommerce (например, AutomateWoo) | Удобный интерфейс, можно настроить без кода | Плагин платный, может быть избыточным | Настройка через UI, нет кода |
| Ручное удаление пользователя | Простота | Ручной труд, высокая вероятность ошибки, нет автоматизации | Не применимо для автоматизации |