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

В чем суть задачи удаления пользователя при отмене подписки в 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Снижение нагрузки, возможность повторных проверокЗадержка удаленияОптимально для крупных сайтов
Использование плагинов управления пользователямиГотовые решения, поддержкаМожет быть избыточно, зависит от плагинаВыбор зависит от задачи
WordPress AJAX валидация форм: пример и реализация
17.11.2025
Как создать кастомный плагин для журналов входов в WordPress
16.03.2026
WordPress регистрация без подтверждения по Email: как реализовать и зачем
03.02.2026
WordPress авторизация по IP адресу: настройка и примеры кода
21.01.2026
WordPress OAuth2 интеграция: практическое руководство с примерами кода
28.11.2025