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

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

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

Диагностика: как понять, что роль не меняется автоматически

Если вы пытались менять роль пользователя вручную или через сторонние плагины, а роль не меняется автоматически при смене статуса заказа, проверьте:

  • Корректно ли срабатывает событие смены статуса заказа;
  • Имеет ли пользователь необходимые права для изменения роли;
  • Не конфликтуют ли плагины, которые управляют ролями или заказами;
  • Отсутствуют ли ошибки PHP в логах при попытке изменения роли.

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

Реализуем функционал с помощью хука woocommerce_order_status_completed, который срабатывает при переводе заказа в статус "завершён". В примере ниже меняем роль пользователя на "premium_customer".

add_action('woocommerce_order_status_completed', 'wpauth_change_user_role_on_order_completed', 10, 1);
function wpauth_change_user_role_on_order_completed($order_id) {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }
    $user_id = $order->get_user_id();
    if (!$user_id) {
        // Гость, роли не меняем
        return;
    }
    $user = new WP_User($user_id);
    // Проверяем, что роль еще не установлена
    if (!in_array('premium_customer', $user->roles)) {
        $user->set_role('premium_customer');
    }
}

Если вам нужно менять роль при другом статусе, например, при переходе заказа в "processing", замените хук на woocommerce_order_status_processing.

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

  1. Создайте тестовый заказ под вашим пользователем или тестовым аккаунтом;
  2. Переведите статус заказа в "завершён" или нужный вам;
  3. Зайдите в Пользователи » Все пользователи в админке и проверьте роль пользователя;
  4. Если роль изменилась на "premium_customer" (или на ту, что вы указали), значит всё работает корректно;
  5. Для проверки в коде можно добавить временный error_log в функцию и посмотреть вывод в логах.

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

  • Роль не меняется: проверьте, что пользователь авторизован и есть ID пользователя в заказе ($order->get_user_id());
  • Функция не срабатывает: убедитесь, что хук указан правильно (woocommerce_order_status_completed именно для нужного статуса);
  • Роль не существует: роль premium_customer должна быть зарегистрирована заранее (через add_role или плагин);
  • Конфликт плагинов: отключите плагины, которые могут влиять на роли или статусы заказов, чтобы проверить конфликт;
  • Ошибка доступа: убедитесь, что скрипт запускается с правами администратора и нет ограничений на изменение ролей.

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

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

Дополнительные примеры и варианты

Если нужно добавить роль, не удаляя существующие:

add_action('woocommerce_order_status_completed', 'wpauth_add_role_on_order_completed', 10, 1);
function wpauth_add_role_on_order_completed($order_id) {
    $order = wc_get_order($order_id);
    $user_id = $order->get_user_id();
    if (!$user_id) return;
    $user = new WP_User($user_id);
    if (!in_array('premium_customer', $user->roles)) {
        $user->add_role('premium_customer');
    }
}

Таблица сравнения подходов:

МетодОписаниеПлюсыМинусы
set_role()Полностью заменяет роль пользователяПросто, чисто меняет праваУдаляет все текущие роли, может привести к потере доступа
add_role()Добавляет дополнительную роль, не удаляя текущиеГибко, сохраняет старые ролиМожет усложнить управление правами
WordPress OAuth2 интеграция: практическое руководство с примерами кода
28.11.2025
WooCommerce: авторизация по телефону без SMS-провайдеров
26.06.2026
WooCommerce: автоматическое удаление пользователя при отмене подписки
07.07.2026
WooCommerce: автоматическое удаление пользователя при отмене подписки с контролем зависимостей
02.08.2026
WordPress авторизация через Google OTP: полное руководство
09.04.2026