В чем суть задачи: зачем менять роль пользователя после подтверждения заказа?
В 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.
Проверка результата после внедрения
- Создайте тестовый заказ под вашим пользователем или тестовым аккаунтом;
- Переведите статус заказа в "завершён" или нужный вам;
- Зайдите в
Пользователи » Все пользователив админке и проверьте роль пользователя; - Если роль изменилась на "premium_customer" (или на ту, что вы указали), значит всё работает корректно;
- Для проверки в коде можно добавить временный
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() | Добавляет дополнительную роль, не удаляя текущие | Гибко, сохраняет старые роли | Может усложнить управление правами |