В чем проблема: зачем удалять пользователя после отмены подписки в WooCommerce?
В интернет-магазинах на WooCommerce с подписками (WooCommerce Subscriptions) иногда возникает необходимость автоматически удалять учетную запись пользователя после того, как он отменил подписку. Это может понадобиться для очистки базы, безопасности или управления доступом к контенту.
Стандартный WooCommerce не предусматривает автоматическое удаление пользователя при отмене подписки, поэтому нужно реализовать кастомное решение.
Диагностика задачи и понимание точек интеграции
Первый шаг — понять, когда именно у пользователя отменяется подписка. WooCommerce Subscriptions генерирует ряд хуков, связанных с изменением статуса подписки:
woocommerce_subscription_status_cancelled— когда подписка отменяется;woocommerce_subscription_status_expired— когда подписка истекает;woocommerce_subscription_status_on-hold— при приостановке подписки.
Для автоматического удаления нам интересен именно хук woocommerce_subscription_status_cancelled.
Также важно учесть, что удалять пользователя нужно аккуратно — с подтверждением, что у него нет других активных подписок или заказов.
Пошаговое решение: как автоматически удалить пользователя после отмены подписки
1. Подключаемся к хуку woocommerce_subscription_status_cancelled для отслеживания отмены.
2. Проверяем, есть ли у пользователя другие активные подписки. Если есть — не удаляем.
3. Если других подписок нет — удаляем пользователя с помощью функции wp_delete_user().
Ниже пример кода, который нужно добавить в файл functions.php вашей темы или кастомного плагина:
add_action('woocommerce_subscription_status_cancelled', 'auto_delete_user_after_subscription_cancelled');
function auto_delete_user_after_subscription_cancelled($subscription) {
$user_id = $subscription->get_user_id();
// Проверяем, есть ли у пользователя другие активные подписки
$args = array(
'customer_id' => $user_id,
'status' => 'active',
'return' => 'ids',
);
$subscriptions = wcs_get_subscriptions($args);
if (empty($subscriptions)) {
// Удаляем пользователя
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
}Обратите внимание, что функция wcs_get_subscriptions() — стандартная в WooCommerce Subscriptions и позволяет получить подписки по параметрам.
Особенности удаления пользователя
- Функция
wp_delete_user()удаляет все данные пользователя, включая посты и комментарии, если не передавать второй параметр. - Если хотите сохранить контент, передайте ID пользователя для переноса постов вторым аргументом.
Проверка результата после внедрения
Чтобы убедиться, что код работает:
- Создайте тестового пользователя и оформите подписку через WooCommerce Subscriptions.
- Отмените подписку через личный кабинет или админку.
- Проверьте, удалился ли пользователь из
wp-admin > Пользователи. - Если пользователь остался — проверьте наличие других активных подписок (они блокируют удаление).
Также можно добавить логирование для отладки:
function auto_delete_user_after_subscription_cancelled($subscription) {
$user_id = $subscription->get_user_id();
error_log('Отмена подписки, пользователь: ' . $user_id);
$args = array(
'customer_id' => $user_id,
'status' => 'active',
'return' => 'ids',
);
$subscriptions = wcs_get_subscriptions($args);
if (empty($subscriptions)) {
error_log('Удаляем пользователя ' . $user_id);
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
} else {
error_log('Пользователь имеет другие активные подписки, удаление отменено');
}
}Частые ошибки и как их исправить
- Ошибка: Пользователь не удаляется, хотя подписка отменена.
Причина: У пользователя есть другие активные подписки или роли, блокирующие удаление.
Решение: Проверьте наличие других подписок и роли пользователя. - Ошибка: Удаляется не тот пользователь.
Причина: Некорректное получение ID пользователя из объекта подписки.
Решение: Используйте метод$subscription->get_user_id(). - Ошибка: Ошибка при вызове
wp_delete_user().
Причина: Отсутствует подключение файлаuser.php.
Решение: Добавьтеrequire_once(ABSPATH . 'wp-admin/includes/user.php');перед вызовом.
Практические советы по безопасности и производительности
- Перед удалением пользователя убедитесь, что данные, которые не нужно терять (например, заказы, отзывы), перенесены или сохранены.
- Автоматическое удаление может вызвать проблемы, если пользователь случайно отменил подписку. Можно добавить отправку email-уведомления администратору перед удалением.
- Для оптимизации не добавляйте сложные операции в хук отмены подписки — удаление пользователя должно быть максимально легким и быстрым.
- Регулярно делайте резервные копии базы данных, особенно при автоматическом удалении пользователей.
Сравнение вариантов удаления пользователя после отмены подписки
| Способ | Плюсы | Минусы |
|---|---|---|
Кастомный код на хуке woocommerce_subscription_status_cancelled | Полный контроль, нет лишних плагинов, гибкость | Требует навыков PHP, риск ошибок при неправильной логике |
| Плагины для управления подписками и пользователями | Простота установки, готовый функционал | Могут быть избыточными, нагружают сайт, меньше контроля |
| Ручное удаление пользователя | Максимальная безопасность, контроль | Трудоемко, не автоматизировано |