WooCommerce: добавление автоматической скидки на первый заказ через код

Диагностика задачи: зачем нужна скидка на первый заказ

Владельцы интернет-магазинов на 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)Удобный интерфейс, много опцийМожет замедлять сайт; возможны конфликтыСложные правила скидок, большие магазины
Кастомный плагинМаксимальная гибкость и масштабируемостьТребует поддержки и обновленияБольшие проекты с уникальными требованиями
WooCommerce: сокращение времени загрузки страниц корзины
22.05.2026
Оптимальное создание и использование WP-Cron в WordPress
14.03.2026
WooCommerce: автоматическое удаление неактивных пользователей с заказами
14.07.2026
Как создать собственный виджет в WordPress с примером кода
17.11.2025
Автоматическое сохранение и обновление мета-полей при изменении записи в WordPress
19.12.2025