Задача: изменить роль пользователя после первой покупки в 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 |