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

В чем проблема: зачем удалять пользователя после отмены подписки в 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 пользователя для переноса постов вторым аргументом.

Проверка результата после внедрения

Чтобы убедиться, что код работает:

  1. Создайте тестового пользователя и оформите подписку через WooCommerce Subscriptions.
  2. Отмените подписку через личный кабинет или админку.
  3. Проверьте, удалился ли пользователь из wp-admin > Пользователи.
  4. Если пользователь остался — проверьте наличие других активных подписок (они блокируют удаление).

Также можно добавить логирование для отладки:

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, риск ошибок при неправильной логике
Плагины для управления подписками и пользователямиПростота установки, готовый функционалМогут быть избыточными, нагружают сайт, меньше контроля
Ручное удаление пользователяМаксимальная безопасность, контрольТрудоемко, не автоматизировано
WordPress авторизация через временные токены: настройка и примеры кода
23.02.2026
WordPress авторизация через REST API: практическое руководство с примерами кода
25.12.2025
WordPress авторизация по OTP без SMS: настройка и примеры кода
10.02.2026
WordPress SAML авторизация: установка и настройка с примерами кода
27.03.2026
Безопасность WordPress: защита от brute force атак
05.11.2025