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

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

В стандартном WooCommerce роль пользователя при регистрации по умолчанию — "Customer". В ряде случаев удобно менять роль после первой успешной покупки, чтобы дать доступ к новым возможностям или контенту. Например, менять роль на "Subscriber" или кастомную роль с расширенными правами.

Диагностика проблемы: почему автоматическое изменение роли не работает

Часто разработчики пытаются менять роль пользователя через хуки, которые срабатывают не в тот момент, либо забывают проверять, что это первая покупка. В результате роль меняется неправильно или не меняется вовсе.

Основные причины:

  • Использование неподходящих хуков (например, woocommerce_checkout_order_processed вместо woocommerce_order_status_completed).
  • Отсутствие проверки, что это первая покупка пользователя.
  • Ошибки в коде, приводящие к конфликтам с другими плагинами.

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

1. Используем правильный хук для отслеживания завершения заказа

Хук woocommerce_order_status_completed срабатывает при смене статуса заказа на "завершен" — это надежный момент для изменения роли.

2. Проверяем, что это первая покупка пользователя

Для этого получаем все заказы пользователя и проверяем их количество.

3. Меняем роль пользователя

Пример кода, который добавляем в functions.php темы или в кастомный плагин:

add_action('woocommerce_order_status_completed', 'wpauth_change_role_after_first_purchase', 10, 1);
function wpauth_change_role_after_first_purchase($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    $user_id = $order->get_user_id();
    if (!$user_id) return; // гость, ничего не делаем

    $customer_orders = wc_get_orders(array(
        'customer_id' => $user_id,
        'status' => 'completed',
        'limit' => -1
    ));

    if (count($customer_orders) === 1) { // первая завершенная покупка
        $user = new WP_User($user_id);
        // Меняем роль. Например, на "subscriber"
        $user->set_role('subscriber');
    }
}

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

Чтобы проверить, что автоматическая смена роли работает:

  • Зарегистрируйте нового пользователя.
  • Сделайте заказ от имени этого пользователя и дождитесь смены статуса заказа на "завершен" (можно вручную в админке).
  • Проверьте в админке WordPress в разделе "Пользователи", изменилась ли роль на нужную.

Если роль не меняется — проверьте логи ошибок PHP и убедитесь, что хук срабатывает (можно добавить error_log() в функцию).

Частые ошибки и как их исправить

  • Хук срабатывает, но роль не меняется. Проверьте, что у пользователя есть ID, и что роль указана корректно. Используйте стандартные роли или заранее зарегистрированные кастомные роли.
  • Функция срабатывает несколько раз. Проверьте, что условие count($customer_orders) === 1 корректно проверяет первую покупку. Иногда заказы могут иметь статусы "возврат" или "отменен", их не учитываем.
  • Конфликты с плагинами управления ролями. Убедитесь, что другие плагины не переопределяют роль после вашего кода.

Практические советы по безопасности и производительности

  • Не изменяйте роль пользователя до подтверждения оплаты и смены статуса заказа на "завершен", чтобы исключить мошенничество.
  • Для больших сайтов с тысячами заказов используйте кэширование запросов wc_get_orders, чтобы не тормозить выполнение.
  • Логируйте операции изменения ролей, чтобы можно было отследить ошибки.

Сравнение подходов для автоматической смены роли

МетодПлюсыМинусыПример
Хук woocommerce_order_status_completedТочно после оплаты, надежноЗадержка до смены статусаКод из статьи
Хук woocommerce_payment_completeСрабатывает сразу после оплатыНе всегда значит завершение заказаМожно использовать, но требует доп. проверки
Проверка при входе пользователяЛегко реализовать, не зависит от статусовЗадержка, роль меняется при логинеКод через wp_login
WooCommerce: автоматическое удаление пользователя при отмене подписки
07.07.2026
WooCommerce: автоматическое отключение подписки и удаление пользователя при отмене
10.07.2026
WordPress авторизация через REST API: практическое руководство с примерами кода
25.12.2025
WooCommerce: ограничение доступа к продуктам по ролям пользователей
07.05.2026
WordPress авторизация по IP адресу: настройка и примеры кода
21.01.2026