Диагностика задачи: зачем нужна скидка на первый заказ
Владельцы интернет-магазинов на WooCommerce часто хотят стимулировать новых покупателей сделать заказ, предоставляя скидку на первый заказ. Однако стандартных настроек WooCommerce для автоматического применения такой скидки нет. Многие обращаются к плагинам, но они могут быть избыточными или конфликтовать с другими расширениями.
Задача: реализовать автоматическое применение скидки (например, 10%) на первый заказ покупателя с помощью минимального и проверяемого кода, без сторонних плагинов.
Пошаговое решение: добавляем скидку на первый заказ через хук WooCommerce
Шаг 1. Создаем функцию для проверки, есть ли заказы у пользователя
Для начала нужно проверить, делал ли пользователь уже заказ. Для зарегистрированных пользователей это просто, для гостей — проверка невозможна, поэтому скидка будет только для пользователей с аккаунтом.
function user_has_orders( $user_id ) {
if ( ! $user_id ) {
return false;
}
$customer_orders = wc_get_orders( array(
'customer_id' => $user_id,
'limit' => 1,
'status' => array('wc-completed', 'wc-processing', 'wc-on-hold'),
) );
return ! empty( $customer_orders );
}Шаг 2. Добавляем скидку через фильтр cart
Используем хук woocommerce_cart_calculate_fees, чтобы добавить отрицательную сумму (скидку), если это первый заказ.
add_action( 'woocommerce_cart_calculate_fees', 'add_first_order_discount' );
function add_first_order_discount( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
$user_id = get_current_user_id();
if ( ! $user_id ) {
return; // скидка только для зарегистрированных пользователей
}
if ( user_has_orders( $user_id ) ) {
return; // если уже есть заказы, скидка не применяется
}
$discount_percentage = 10; // размер скидки в процентах
$discount = $cart->subtotal * ( $discount_percentage / 100 );
if ( $discount > 0 ) {
$cart->add_fee( 'Скидка на первый заказ', -$discount );
}
}Шаг 3. Добавляем проверку в админке и уведомление покупателю
Чтобы покупатель видел скидку в корзине и на этапе оформления, достаточно описанного выше. Рекомендуется добавить уведомление на странице корзины.
add_action( 'woocommerce_before_cart', 'show_first_order_discount_notice' );
function show_first_order_discount_notice() {
$user_id = get_current_user_id();
if ( ! $user_id ) {
return;
}
if ( ! user_has_orders( $user_id ) ) {
wc_print_notice( 'Поздравляем! Вам автоматически предоставлена скидка 10% на первый заказ.', 'success' );
}
}Проверка результата после внедрения
- Залогиньтесь под пользователем без заказов, добавьте товары в корзину, перейдите в корзину — увидите уведомление и скидку.
- Создайте заказ от этого пользователя и убедитесь, что при повторном посещении скидка не применяется.
- Выйдите из аккаунта и проверьте, что скидка не появляется для гостей.
Частые ошибки и как их исправить
- Скидка не появляется для зарегистрированных пользователей без заказов. Проверьте, что функция
user_has_ordersправильно проверяет статусы заказов. Возможно, в магазине используются другие статусы, расширьте массив'status'. - Скидка применяется всем пользователям. Убедитесь, что проверка
user_has_ordersработает корректно, и что скидка не добавляется для гостей. - Скидка не отображается на странице оформления заказа. Убедитесь, что хук
woocommerce_cart_calculate_feesвызывается и что код не конфликтует с плагинами кеширования.
Практические советы по безопасности и производительности
- Для оптимизации используйте кэширование данных о заказах пользователя, если сайт большой.
- Внимательно тестируйте код при использовании сторонних плагинов управления скидками и кеширования.
- При необходимости расширяйте функционал, добавляя проверку на купоны или другие условия.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код через хуки (описанный) | Легко кастомизировать, нет лишних плагинов | Требует базовых знаний PHP; не подходит для гостей | Маленькие и средние магазины с регистрацией |
| Плагины скидок (например, WooCommerce Discount Rules) | Удобный интерфейс, много опций | Может замедлять сайт; возможны конфликты | Сложные правила скидок, большие магазины |
| Кастомный плагин | Максимальная гибкость и масштабируемость | Требует поддержки и обновления | Большие проекты с уникальными требованиями |