В чем суть задачи и зачем удалять пользователя после отмены подписки
В WooCommerce с подписками (WooCommerce Subscriptions) пользователи могут отменять подписки. Иногда возникает задача — полностью удалить учетную запись пользователя после отмены подписки, чтобы очистить базу и предотвратить доступ к контенту. Особенно актуально для сервисов с платным доступом, где отмена подписки означает прекращение отношений.
В стандартном WooCommerce такой функционал отсутствует. Нужно реализовать автоматическое удаление пользователя программно, используя хуки WooCommerce Subscriptions.
Диагностика: как понять, что подписка отменена и нужно удалить пользователя
Подписка в WooCommerce Subscriptions — это тип записи shop_subscription. Ее статус меняется при отмене на cancelled. Чтобы отследить отмену, используем хук 'woocommerce_subscription_status_cancelled', который передает объект подписки.
Важно проверить, что статус подписки действительно изменился и что пользователь существует. Также нужно учитывать, что подписка может быть у нескольких пользователей (в случае совместного аккаунта), но обычно — у одного.
Пошаговое решение: код для автоматического удаления пользователя
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
<?php
add_action('woocommerce_subscription_status_cancelled', 'delete_user_after_subscription_cancelled', 10, 1);
function delete_user_after_subscription_cancelled( $subscription ) {
// Получаем ID пользователя
$user_id = $subscription->get_user_id();
if ( ! $user_id ) {
error_log('Подписка отменена, но пользователь не найден.');
return;
}
// Получаем объект пользователя
$user = get_user_by('ID', $user_id);
if ( ! $user ) {
error_log('Пользователь с ID ' . $user_id . ' не существует.');
return;
}
// Проверяем, не админ ли пользователь (рекомендуется не удалять админов)
if ( in_array('administrator', $user->roles) ) {
error_log('Попытка удалить администратора запрещена.');
return;
}
// Удаляем пользователя вместе с контентом
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user( $user_id );
error_log('Пользователь с ID ' . $user_id . ' удалён после отмены подписки.');
}Объяснение:
- Хук
woocommerce_subscription_status_cancelledсрабатывает при смене статуса подписки на "отменена". - Получаем ID пользователя из объекта подписки.
- Проверяем существование пользователя и роль, чтобы не удалять админов.
- Удаляем пользователя функцией
wp_delete_user, удаляя все его данные и контент.
Как проверить, что решение работает
- Создайте тестовую подписку на сайте и свяжите с тестовым пользователем.
- Отмените подписку через Личный кабинет или админку WooCommerce.
- Проверьте, что пользователь автоматически удалился из базы (
wp_users). - Проверьте логи ошибок PHP (если включено), чтобы увидеть записи
error_log. - Убедитесь, что пользователь не может войти на сайт после отмены.
Частые ошибки и как их избежать
- Удаление администратора. Если не добавить проверку роли, можно случайно удалить админа. Это критично. Добавьте проверку ролей.
- Подписка без пользователя. Некоторые подписки могут быть анонимными или без связанного пользователя. В этом случае код должен корректно игнорировать удаление.
- Потеря данных. Если пользователь владеет важным контентом (публикациями, заказами), удаление может привести к проблемам. Рассмотрите опцию передачи контента другому пользователю в
wp_delete_user. - Несовместимость с кэшированием. Если сайт сильно кэшируется, пользователь может быть виден еще некоторое время. Почистите кэш после удаления.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы перед внедрением автоматического удаления пользователей.
- Добавьте логирование действий удаления для последующего аудита.
- Рассмотрите создание отдельного плагина с этой функциональностью для удобства поддержки.
- Для крупных магазинов с большим количеством подписчиков лучше запускать удаление пользователей в фоне (WP Cron) во избежание долгих запросов.
Сравнение вариантов реализации
| Вариант | Плюсы | Минусы |
|---|---|---|
| Автоматическое удаление через хук (как в статье) | Полностью автоматизировано, надежно, без плагинов | Риск удаления важных пользователей, требует тестирования |
| Удаление вручную через админку | Контроль над процессом, меньше риска | Не автоматизировано, требует времени |
| Использование сторонних плагинов для управления пользователями | Дополнительные функции, удобный интерфейс | Зависимость от плагина, возможные конфликты |