Диагностика задачи: зачем нужна скидка на первую покупку в WooCommerce?
Скидка на первую покупку — классический маркетинговый инструмент для привлечения новых клиентов. В WooCommerce стандартных настроек для автоматического применения такой скидки нет. Обычно пользователи реализуют это через купоны или плагины, но это не всегда удобно или оптимально. Мы рассмотрим, как программно создать и применить скидку на первую покупку через функции темы или плагина, без сторонних решений.
Анализ решения: что нужно реализовать?
- Проверять, совершал ли пользователь заказы раньше.
- Если нет — автоматически применить скидку на корзину.
- Обеспечить настройку размера скидки (например, 10%).
- Обработать случаи гостевого пользователя (неавторизованного).
- Обеспечить совместимость с кэшированием и другими плагинами скидок.
Пошаговое решение: код для автоматической скидки на первую покупку
Добавьте следующий код в functions.php вашей дочерней темы или в отдельный плагин:
add_action('woocommerce_cart_calculate_fees', 'wptips_add_first_order_discount', 20, 1);
function wptips_add_first_order_discount( $cart ) {
if ( is_admin() && ! defined('DOING_AJAX') ) return;
// Проверяем, авторизован ли пользователь
if ( ! is_user_logged_in() ) return;
$user_id = get_current_user_id();
// Проверяем, есть ли у пользователя завершённые заказы
$args = array(
'customer_id' => $user_id,
'status' => array('wc-completed', 'wc-processing'),
'limit' => 1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
// Если заказов нет — применяем скидку
if ( count($orders) === 0 ) {
$discount_percent = 10; // Размер скидки в процентах
$discount_amount = $cart->subtotal * ($discount_percent / 100);
// Добавляем отрицательную плату — скидку
$cart->add_fee( sprintf('Скидка %d%% на первую покупку', $discount_percent), -$discount_amount );
}
}Как работает код
При пересчёте корзины функция проверяет, авторизован ли пользователь и есть ли у него завершённые или в обработке заказы. Если заказов нет, добавляется скидка в виде отрицательной платы. Скидка считается от текущей суммы корзины (без учёта налогов и других сборов).
Проверка результата после внедрения
- Залогиньтесь под новым тестовым пользователем без заказов.
- Добавьте товар в корзину и перейдите к корзине.
- Убедитесь, что внизу корзины появилась строка с вашей скидкой, и итоговая сумма уменьшилась на 10%.
- Сделайте заказ и вновь зайдите в корзину — скидка больше не должна применяться.
- Попробуйте под гостевым пользователем — скидка не должна появляться (чтобы не было злоупотреблений).
Частые ошибки и их исправление
- Скидка не применяется: Проверьте, что в теме или плагине нет конфликтов с другими хуками на
woocommerce_cart_calculate_fees. Также важен порядок приоритета — 20 обычно подходит. - Скидка видна гостям: Код специально игнорирует неавторизованных, но если хотите разрешить гостям — нужен другой подход, например, через куки.
- Неправильный размер скидки: Убедитесь, что берёте правильную сумму корзины через
$cart->subtotal, а не$cart->total. - Конфликты с другими скидками и купонами: Проверьте, что плагин скидок корректно взаимодействует с этим кодом. Возможно, придётся менять приоритеты.
Практические советы по безопасности и производительности
- Не используйте автоматические скидки для гостей без ограничений — это риск злоупотреблений.
- Кеширование корзины и страниц оформления заказа может мешать корректному применению скидок. Убедитесь, что корзина не кешируется.
- Для сложных сценариев (например, комбинирование с купонами) лучше использовать проверенные плагины или расширять логику с учётом всех условий.
Сравнение подходов для реализации скидки на первую покупку в WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php | Простой код для автоматической скидки при первой покупке | Лёгкая настройка, без плагинов, контроль логики | Требует навыков, возможны конфликты, не для гостей |
| Плагин скидок (например, WooCommerce Smart Coupons) | Плагин с визуальным интерфейсом для создания купонов и скидок | Много функций, поддержка, удобство | Нагрузка на сайт, иногда платно |
| Использование купонов вручную | Создание купона и рассылка клиентам | Простота, нет кода | Не автоматизировано, требует ручных действий |