Задача: зачем менять роль пользователя после первой покупки в 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или через плагин.- Исключаем текущий заказ, чтобы не считать его в проверке.
Проверка результата после внедрения
- Создайте тестового пользователя и сделайте первую покупку через фронтэнд.
- Перейдите в админку WordPress > Пользователи и проверьте, изменилась ли у пользователя роль на нужную.
- Сделайте вторую покупку тем же пользователем — роль не должна меняться повторно.
- Для отладки можно временно добавить
error_logв функцию, чтобы видеть вызовы вdebug.log.
Частые ошибки и их исправление
- Роль не меняется: Проверьте, что у пользователя действительно есть ID (не гость) и что роль
vip_customerсуществует. - Функция срабатывает несколько раз: Убедитесь, что исключаете текущий заказ из проверки и проверяете наличие других завершённых заказов.
- Пользователь с гостевым заказом: Для гостей роль не меняется, так как у них нет ID пользователя.
- Роль меняется, но сайт не обновляет доступы: Проверьте, нет ли кэширования ролей или плагинов, которые конфликтуют с изменением ролей.
Практические советы по безопасности и производительности
- Не меняйте роль на
administratorили другие критичные без веских причин. - Если у вас большой магазин, кешируйте результаты проверки заказов, чтобы не нагружать базу.
- Создайте резервную копию базы данных перед массовым изменением ролей.
- Проверяйте совместимость с плагинами, которые влияют на роли и права пользователей.
Сравнение способов реализации
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_order_status_completed | Изменение роли при смене статуса заказа на "завершен" | Простой, надёжный, срабатывает при реальном завершении | Не сработает, если заказ никогда не переходит в "завершен" |
Хук woocommerce_thankyou | Изменение роли сразу после оформления заказа | Работает сразу после оформления | Роль меняется даже если заказ не оплачен или отменён |
| Запуск крон-задачи для проверки первых покупок | Периодическая проверка и обновление ролей | Гибко, можно исправить ошибки | Задержка и дополнительная нагрузка на сайт |