В чем суть задачи удаления пользователя при отмене подписки в WooCommerce
Часто в WooCommerce возникает необходимость автоматически удалять пользователя сразу после отмены подписки. Однако простой вызов удаления пользователя при событии отмены может привести к потере данных, если пользователь имеет активные заказы, другие подписки или контент, к которому привязана учетная запись. В этой статье разберем, как правильно реализовать автоматическое удаление пользователя с проверкой зависимостей и корректной деактивацией подписки.
Диагностика проблемы: почему простой хук удаления не работает
Попытка удалить пользователя по событию woocommerce_subscription_status_cancelled или woocommerce_subscription_status_pending-cancel часто приводит к ошибкам или потере важных данных. Основные причины:
- Пользователь может иметь другие активные подписки — удалять его нельзя.
- Пользователь может быть связан с заказами, комментариями, мета-данными — их потеря повлияет на целостность данных.
- Удаление пользователя без проверки может вызвать сбои в работе сайта.
Для проверки проблемы подключите плагин Query Monitor и следите за ошибками удаления и запросами к базе данных при отмене подписки.
Пошаговое решение: как безопасно удалять пользователя при отмене подписки
1. Отслеживаем событие отмены подписки
add_action('woocommerce_subscription_status_cancelled', 'custom_delete_user_on_subscription_cancel', 10, 1);2. Проверяем наличие активных подписок у пользователя
function user_has_active_subscriptions($user_id) {
if (!class_exists('WC_Subscriptions_Manager')) {
return false;
}
$subscriptions = wcs_get_users_subscriptions($user_id);
foreach ($subscriptions as $subscription) {
if ($subscription->has_status(array('active', 'on-hold', 'pending')) ) {
return true;
}
}
return false;
}3. Проверяем другие зависимости (заказы и контент)
function user_has_orders_or_content($user_id) {
$orders = wc_get_orders(array(
'customer_id' => $user_id,
'limit' => 1,
));
if (!empty($orders)) {
return true;
}
// Можно добавить проверку на комментарии, кастомный контент и т.п.
return false;
}4. Удаляем пользователя, если проверка прошла
function custom_delete_user_on_subscription_cancel($subscription) {
$user_id = $subscription->get_user_id();
if (!$user_id) {
return; // нет пользователя
}
// Проверяем активные подписки
if (user_has_active_subscriptions($user_id)) {
return; // есть другие активные подписки
}
// Проверяем заказы и контент
if (user_has_orders_or_content($user_id)) {
return; // есть заказы или связанный контент
}
// Все проверки пройдены - удаляем пользователя
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}Проверка результата после внедрения
- Создайте тестового пользователя с одной подпиской и без заказов.
- Отмените подписку через админку WooCommerce или личный кабинет пользователя.
- Проверьте в разделе "Пользователи", что пользователь удалён.
- Создайте пользователя с несколькими подписками или заказами и попробуйте отменить одну подписку — пользователь не должен удалиться.
- Проверьте логи ошибок сервера при удалении.
Частые ошибки и как их устранить
- Удаление пользователя с активными подписками или заказами: Приводит к потере данных. Решение — проверять зависимости перед удалением.
- Ошибка «класс WC_Subscriptions_Manager не найден»: Плагин WooCommerce Subscriptions не активирован. Решение — убедитесь, что плагин установлен и активен.
- Отсутствие прав на удаление пользователя: Скрипт выполняется под ролью без прав. Решение — запускать код в контексте администратора или через cron.
- Удаление администратора: Код не проверяет роль. Решение — обязательно исключать админов из автоматического удаления.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед внедрением автоматического удаления пользователей.
- Добавьте логирование удалений для аудита и отладки через
error_logили специализированные плагины. - Используйте
wp_delete_user($user_id, $reassign)с параметром$reassign, чтобы переназначить содержимое другому пользователю, если это необходимо. - По возможности используйте транзакции базы данных или отложенное удаление через WP Cron для снижения нагрузки.
Сравнение подходов к удалению пользователей при отмене подписки
| Метод | Плюсы | Минусы | Примечание |
|---|---|---|---|
| Простое удаление на событие отмены | Простая реализация | Потеря данных, ошибки при наличии зависимостей | Рискованно |
| Удаление с проверкой подписок и заказов | Безопасность данных, контроль зависимостей | Сложнее в реализации | Рекомендуется |
| Отложенное удаление через cron | Снижение нагрузки, возможность повторных проверок | Задержка удаления | Оптимально для крупных сайтов |
| Использование плагинов управления пользователями | Готовые решения, поддержка | Может быть избыточно, зависит от плагина | Выбор зависит от задачи |