В чем заключается задача и зачем менять роль после первой покупки
В WooCommerce часто возникает задача автоматически изменить роль пользователя после совершения первой покупки. Например, из стандартного "Customer" перевести его в роль "VIP" или "Премиум-клиент" для предоставления дополнительных возможностей, скидок или доступа к закрытому контенту.
Это позволяет гибко управлять доступом и персонализировать опыт покупателя без ручного вмешательства.
Диагностика проблемы: почему стандартный WooCommerce не меняет роль
По умолчанию WooCommerce не меняет роль пользователя после покупки — роль остается той, что была при регистрации, чаще всего "Customer". Если на сайте требуется иная логика, придется реализовать её самостоятельно.
Проверить текущую роль пользователя можно в админке WordPress в разделе "Пользователи" или программно:
$user = wp_get_current_user();
var_dump($user->roles);Если роль не меняется после заказа, значит, нужно добавить кастомный код, который сработает после успешного завершения заказа.
Пошаговое решение: как программно изменить роль после первой покупки
1. Создаем функцию, которая проверит количество покупок пользователя
function wpa_check_first_order_and_change_role($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' => $user_id,
'status' => 'completed',
'limit' => -1
));
// Если это первая покупка (текущий заказ единственный)
if (count($customer_orders) === 1) {
$user = new WP_User($user_id);
// Меняем роль, например, на "vip_customer"
$user->set_role('vip_customer');
}
}2. Подключаем функцию к хуку завершения заказа
add_action('woocommerce_order_status_completed', 'wpa_check_first_order_and_change_role', 10, 1);Этот хук срабатывает при смене статуса заказа на "завершен" — лучшее время для смены роли.
Проверка результата после внедрения
- Оформите новый заказ с аккаунта тестового пользователя;
- Убедитесь, что после смены статуса заказа на "завершен" у пользователя изменилась роль на "vip_customer";
- Проверьте роль в админке WordPress в разделе "Пользователи";
- Для дополнительной проверки можно вывести роль на сайте через
wp_get_current_user()->roles; - Если роль не меняется, проверьте, что заказ действительно статус "completed" и пользователь авторизован.
Частые ошибки и как их исправить
- Роль не меняется: проверьте, что функция подключена к правильному хуку
woocommerce_order_status_completedи что заказ действительно меняет статус на "завершен". - Пользователь не авторизован: если заказ сделан гостем (без регистрации),
$order->get_user_id()вернет 0 — роль сменить не получится. - Роль не существует: убедитесь, что роль "vip_customer" зарегистрирована в WordPress, иначе смена роли не сработает.
- Несоответствие статусов заказов: в коде фильтруются только заказы со статусом "completed" — если ваш магазин использует другие статусы, адаптируйте код.
Практические советы по безопасности и производительности
- Для добавления новой роли используйте функцию
add_role()в файле плагина или functions.php темы, чтобы избежать ошибок. - Не переусердствуйте с количеством запросов к базе —
wc_get_ordersс параметромlimit = -1может быть затратным на больших магазинах. Для оптимизации можно использовать прямой SQL-запрос подсчета заказов. - Обрабатывайте только заказы со статусом "completed" для надежности — это гарантирует, что оплата прошла успешно.
- Добавьте проверку nonce и capability, если расширяете функционал для админ-панели.
Альтернативы: плагины vs кастомный код
| Вариант | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Кастомный код | Максимальная гибкость, нет дополнительных плагинов | Нужны знания PHP, поддержка на владельце сайта | Если нужны нестандартные роли и логика |
| Плагин "User Role Editor" или "WooCommerce Role Based Pricing" | Простая настройка, готовые решения | Может влиять на производительность, ограниченная кастомизация | Для стандартных сценариев смены ролей и скидок |