Проблема: повторные покупки одного товара одним пользователем
В интернет-магазинах на WooCommerce иногда возникает задача запретить пользователям покупать один и тот же товар повторно. Это актуально для товаров с ограниченным количеством, цифровых продуктов с ограниченной лицензией или при проведении акций с ограничениями.
Диагностика проблемы
Если вы столкнулись с тем, что пользователи могут оформить повторный заказ одного и того же товара, хотя по бизнес-логике этого быть не должно, нужно:
- Убедиться, что пользователь авторизован (гость не может быть однозначно идентифицирован).
- Понять, какие товары должны иметь ограничение повторной покупки (все или только определённые категории).
- Проверить, нет ли конфликтов с плагинами, управляющими корзиной или заказами.
Пошаговое решение: блокировка повторной покупки товара
1. Проверяем, авторизован ли пользователь
Ограничение имеет смысл только для авторизованных пользователей, иначе невозможно однозначно определить покупателя.
2. Проверяем наличие товара в предыдущих заказах
Для этого используем хук woocommerce_add_to_cart_validation, который срабатывает при добавлении товара в корзину. Если товар уже заказан, блокируем добавление с сообщением.
3. Реализация кода
add_filter('woocommerce_add_to_cart_validation', 'wpkey_prevent_duplicate_purchase', 10, 3);
function wpkey_prevent_duplicate_purchase($passed, $product_id, $quantity) {
if (!is_user_logged_in()) {
return $passed; // Разрешаем гостям
}
$user_id = get_current_user_id();
$orders = wc_get_orders(array(
'customer_id' => $user_id,
'status' => array('completed', 'processing', 'on-hold'),
'limit' => -1,
));
foreach ($orders as $order) {
foreach ($order->get_items() as $item) {
if ($item->get_product_id() == $product_id) {
wc_add_notice(__('Вы уже покупали этот товар и не можете приобрести его повторно.', 'woocommerce'), 'error');
return false;
}
}
}
return $passed;
}Проверка результата после внедрения
Чтобы убедиться, что запрет работает:
- Авторизуйтесь под пользователем, который уже покупал товар.
- Попробуйте снова добавить этот товар в корзину.
- Должно появиться сообщение об ошибке, и товар не добавится.
- Для новых пользователей или тех, кто не покупал товар, добавление должно работать.
Частые ошибки и их исправление
- Ошибка: Пользователь не авторизован, и товар можно купить повторно.
Исправление: Добавьте уведомление, что для покупки товара с ограничением нужно войти в аккаунт. - Ошибка: Большая нагрузка и замедление при проверке заказов.
Исправление: Кэшируйте результаты проверки или ограничьте поиск только по нужным статусам заказов. - Ошибка: Запрет работает не для вариативных товаров.
Исправление: Модифицируйте проверку, учитывая вариации черезget_variation_id().
Практические советы по оптимизации и безопасности
- Не проверяйте заказы со статусом «отменён» или «возврат», чтобы не блокировать повторную покупку по ошибке.
- Если товаров много, используйте индексы в базе данных или кэширование для ускорения запросов.
- Добавьте логирование попыток повторной покупки для аудита и анализа поведения пользователей.
Варианты реализации: плагин vs код
| Подход | Плюсы | Минусы |
|---|---|---|
| Реализация через код (хук) | Полный контроль, лёгкая кастомизация, без доп. плагинов | Нужно писать и поддерживать код, требует навыков разработки |
| Плагин ограничения покупок | Быстрая установка, готовый интерфейс, поддержка | Может нагрузить сайт, ограничения по кастомизации, платные решения |