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

Диагностика задачи: зачем удалять пользователя при отмене подписки в 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, нет кода
Ручное удаление пользователяПростотаРучной труд, высокая вероятность ошибки, нет автоматизацииНе применимо для автоматизации
WordPress REST API: создание кастомной аутентификации по токену
25.01.2026
WooCommerce: автоматическое удаление пользователя при отмене заказа
21.04.2026
WordPress автоматическая блокировка подозрительных входов: настройка и примеры кода
17.12.2025
WordPress авторизация без cookie: решение проблем и примеры кода
06.02.2026
Кастомизация процесса восстановления пароля в WordPress: пошаговое руководство
03.03.2026