Диагностика задачи: зачем ограничивать количество товаров по ролям
В интернет-магазинах на WooCommerce иногда требуется различать ограничения для разных групп пользователей. Например, оптовикам можно разрешить покупать большие объемы, а обычным клиентам — ограничить максимальное количество единиц товара в корзине. Это помогает контролировать запасы, стимулировать оптовые продажи или предотвращать злоупотребления.
Как реализовать лимиты на количество товаров в корзине по ролям
WooCommerce не имеет встроенного функционала для ограничения количества товаров в корзине по ролям. Для решения задачи нужно добавить кастомный PHP-код через functions.php вашей темы или в виде отдельного плагина.
Пример кода для установки лимита по ролям
add_action('woocommerce_check_cart_items', 'limit_cart_items_by_user_role');
function limit_cart_items_by_user_role() {
// Получаем объект текущего пользователя
$user = wp_get_current_user();
if ( ! $user->exists() ) {
return; // Для гостей ограничений не ставим
}
// Определяем роли и лимиты
$limits = array(
'subscriber' => 3, // обычный пользователь может добавить не более 3 товаров
'wholesale_customer' => 100, // оптовик — до 100 товаров
'administrator' => 0, // без ограничений
);
// Проверяем роли пользователя и устанавливаем лимит
$user_roles = (array) $user->roles;
$max_items = 0;
foreach ($user_roles as $role) {
if (isset($limits[$role])) {
$max_items = max($max_items, $limits[$role]);
}
}
// 0 значит без ограничений
if ($max_items === 0) {
return;
}
// Считаем количество товаров в корзине
$cart_quantity = WC()->cart->get_cart_contents_count();
// Если превышен лимит, выводим ошибку и очищаем корзину
if ($cart_quantity > $max_items) {
wc_add_notice(sprintf('Вы не можете добавить более %d товаров в корзину.', $max_items), 'error');
// Дополнительно можно удалить лишние товары или блокировать добавление
}
}Данный код проверяет роли пользователя, находит максимальный установленный лимит и сравнивает с текущим количеством товаров в корзине. При превышении выводится ошибка.
Как расширить функционал: ограничения по каждому товару
Если нужно ограничивать количество по каждому товару, можно заменить подсчет на проверку количества каждого товара отдельно:
add_action('woocommerce_add_to_cart_validation', 'limit_quantity_per_product_by_role', 10, 3);
function limit_quantity_per_product_by_role($passed, $product_id, $quantity) {
$user = wp_get_current_user();
if ( ! $user->exists() ) {
return $passed;
}
$limits = array(
'subscriber' => 3,
'wholesale_customer' => 100,
'administrator' => 0,
);
$user_roles = (array) $user->roles;
$max_quantity = 0;
foreach ($user_roles as $role) {
if (isset($limits[$role])) {
$max_quantity = max($max_quantity, $limits[$role]);
}
}
if ($max_quantity === 0) {
return $passed;
}
$cart = WC()->cart->get_cart();
$current_quantity = 0;
foreach ($cart as $cart_item_key => $cart_item) {
if ($cart_item['product_id'] == $product_id) {
$current_quantity += $cart_item['quantity'];
}
}
if (($current_quantity + $quantity) > $max_quantity) {
wc_add_notice(sprintf('Для вашей роли максимальное количество этого товара — %d.', $max_quantity), 'error');
return false;
}
return $passed;
}Проверка результата
Чтобы проверить работу кода:
- Авторизуйтесь под пользователем с разной ролью (например, subscriber и wholesale_customer).
- Добавьте в корзину товары, превышая заданный лимит.
- Убедитесь, что при превышении появляется соответствующее сообщение об ошибке и дальше добавление блокируется.
Частые ошибки и их исправления
- Код не срабатывает: Возможно, код добавлен в неправильный файл или тема не активна. Проверьте, что
functions.phpподключен и нет ошибок PHP. - Пользователь без роли получает ошибку: Проверьте, что проверка роли корректна, и для гостей ограничения не установлены.
- Ошибка не выводится, но добавление блокируется: Удостоверьтесь, что функция
wc_add_noticeвызывается до редиректа, и тема выводит уведомления WooCommerce. - Лимиты не учитывают все роли пользователя: В коде используется максимальный лимит из всех ролей — измените логику, если нужно другое поведение.
Практические советы по безопасности и производительности
- Используйте минимально необходимый объем кода в хуках, чтобы не замедлять добавление в корзину.
- Кешируйте роли пользователя, если получаете их часто в других местах сайта.
- Проверяйте, что уведомления WooCommerce выводятся корректно, чтобы пользователь понимал причину блокировки.
- Для сложных ограничений рассмотрите создание отдельного плагина вместо добавления кода в тему — так проще обновлять и контролировать функционал.
Сравнение вариантов реализации ограничения лимитов по ролям
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код в functions.php | Быстро, бесплатно, гибко | Может потеряться при смене темы, требует навыков PHP | Код из статьи |
| Плагин ограничения корзины (например, WooCommerce Max Quantity) | Простой интерфейс, поддержка | Платные, ограниченная кастомизация | WooCommerce Max Quantity |
| Комбинация кода и плагинов | Гибкость и удобство | Сложнее поддерживать | Код + плагин уведомлений |