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

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

Иногда требуется автоматизировать процесс изменения роли пользователя после совершения первой покупки. Это полезно для предоставления доступа к закрытому контенту, запуску специальных рассылок или настройки других прав доступа. WooCommerce по умолчанию не меняет роли пользователей, поэтому нужно реализовать это самостоятельно через хуки WordPress.

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

Первая покупка — это завершенный заказ со статусом completed (или другой подходящий, например processing). Нужно отследить переход заказа в такой статус и проверить, что у пользователя ранее не было других завершенных заказов. Это позволит избежать повторного изменения роли.

Как проверить, что у пользователя нет заказов

Используйте функцию WooCommerce wc_get_orders с параметром пользователя. Если вернется пустой массив — это первая покупка.

function user_has_completed_orders( $user_id ) {
    $orders = wc_get_orders( array(
        'customer_id' => $user_id,
        'status'      => array('completed','processing'),
        'limit'       => 1,
    ) );
    return ! empty( $orders );
}

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

1. Подключитесь к хуку woocommerce_order_status_completed — он срабатывает при смене статуса заказа на "завершен".

2. Получите ID пользователя из заказа.

3. Проверьте, что это первая покупка.

4. Измените роль пользователя.

add_action( 'woocommerce_order_status_completed', 'change_user_role_after_first_purchase', 10, 1 );
function change_user_role_after_first_purchase( $order_id ) {
    $order = wc_get_order( $order_id );
    $user_id = $order->get_user_id();

    if ( ! $user_id ) {
        return; // Гость или неизвестный пользователь
    }

    // Проверяем, есть ли у пользователя завершённые заказы кроме текущего
    $orders = wc_get_orders( array(
        'customer_id' => $user_id,
        'status'      => array('completed','processing'),
        'exclude'     => array( $order_id ),
        'limit'       => 1,
    ) );

    if ( empty( $orders ) ) {
        // Это первая покупка, меняем роль
        $user = new WP_User( $user_id );
        $user->set_role( 'vip_customer' ); // замените на нужную роль
    }
}

Примечания по коду

  • vip_customer — пример кастомной роли, её нужно создать заранее через add_role или через плагин.
  • Исключаем текущий заказ, чтобы не считать его в проверке.

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

  1. Создайте тестового пользователя и сделайте первую покупку через фронтэнд.
  2. Перейдите в админку WordPress > Пользователи и проверьте, изменилась ли у пользователя роль на нужную.
  3. Сделайте вторую покупку тем же пользователем — роль не должна меняться повторно.
  4. Для отладки можно временно добавить error_log в функцию, чтобы видеть вызовы в debug.log.

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

  • Роль не меняется: Проверьте, что у пользователя действительно есть ID (не гость) и что роль vip_customer существует.
  • Функция срабатывает несколько раз: Убедитесь, что исключаете текущий заказ из проверки и проверяете наличие других завершённых заказов.
  • Пользователь с гостевым заказом: Для гостей роль не меняется, так как у них нет ID пользователя.
  • Роль меняется, но сайт не обновляет доступы: Проверьте, нет ли кэширования ролей или плагинов, которые конфликтуют с изменением ролей.

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

  • Не меняйте роль на administrator или другие критичные без веских причин.
  • Если у вас большой магазин, кешируйте результаты проверки заказов, чтобы не нагружать базу.
  • Создайте резервную копию базы данных перед массовым изменением ролей.
  • Проверяйте совместимость с плагинами, которые влияют на роли и права пользователей.

Сравнение способов реализации

МетодОписаниеПлюсыМинусы
Хук woocommerce_order_status_completedИзменение роли при смене статуса заказа на "завершен"Простой, надёжный, срабатывает при реальном завершенииНе сработает, если заказ никогда не переходит в "завершен"
Хук woocommerce_thankyouИзменение роли сразу после оформления заказаРаботает сразу после оформленияРоль меняется даже если заказ не оплачен или отменён
Запуск крон-задачи для проверки первых покупокПериодическая проверка и обновление ролейГибко, можно исправить ошибкиЗадержка и дополнительная нагрузка на сайт
WooCommerce авторизация через SMS без использования SMS-провайдеров: практическое решение
11.05.2026
WordPress SAML авторизация: установка и настройка с примерами кода
27.03.2026
WordPress авторизация через Google OTP: полное руководство
09.04.2026
WordPress авторизация без пароля: как настроить и использовать
31.10.2025
WordPress регистрация без подтверждения Email: как реализовать и зачем это нужно
30.03.2026