WooCommerce: автоматическое отключение подписки и удаление пользователя при отмене

Диагностика задачи: зачем автоматизировать отключение подписок и удаление пользователей

В 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-заданиемБолее безопасно, можно вручную отменить удалениеСложнее в реализации и поддержкеКрупные проекты с большим количеством пользователей
Удаление вручную через админ-панель с фильтром по статусу подпискиМаксимальный контроль, нет риска ошибочного удаленияТребует ручной работыДля проектов с небольшим числом подписчиков
WordPress автоматическая блокировка подозрительных входов: настройка и примеры кода
17.12.2025
WooCommerce: ограничение доступа к страницам по ролям пользователей
26.04.2026
WooCommerce: авторизация по телефонному номеру без SMS-провайдера
16.05.2026
WordPress регистрация без подтверждения Email: как реализовать и зачем это нужно
30.03.2026
WooCommerce: авторизация по телефону без SMS-провайдеров
26.06.2026