Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Купоны

Купон — код, который покупатель вводит в корзине и получает скидку. В панели купоны создают в «Маркетинг → Купоны», а в коде это объект WC_Coupon. Поле для кода появляется в корзине, если в «WooCommerce → Настройки → Основные» отмечено «Включить использование купонов».

Где писать код

Создайте файл includes/coupons.php и подключите его в acme-shop.php. Разовые операции, как и раньше, — в папке scripts.

Чтение купона

// wp-content/plugins/acme-shop/scripts/show-coupon.php
$coupon = new WC_Coupon('WELCOME10');
 
echo $coupon->get_id() . PHP_EOL;
echo $coupon->get_discount_type() . PHP_EOL;
echo $coupon->get_amount() . PHP_EOL;

Конструктор принимает код купона. Создайте купон WELCOME10 в панели и запустите файл через wp eval-file: скрипт напечатает идентификатор, вид скидки и её размер. У несуществующего купона get_id() вернёт 0.

Виды скидки

ЗначениеЧто означает
percentПроцент от суммы
fixed_cartФиксированная сумма на всю корзину
fixed_productФиксированная сумма на каждый подходящий товар

Создание в коде

// wp-content/plugins/acme-shop/scripts/create-coupon.php
$coupon = new WC_Coupon();
 
$coupon->set_code('SPRING15');
$coupon->set_discount_type('percent');
$coupon->set_amount(15);
$coupon->set_minimum_amount('30');
$coupon->set_usage_limit(100);
$coupon->set_individual_use(true);
$coupon->set_date_expires(strtotime('+30 days'));
 
$coupon->save();

Купон на 15 % действует месяц, не больше ста раз, при корзине от 30 € и не сочетается с другими купонами. После запуска он появится в «Маркетинг → Купоны» и его можно ввести в корзине.

Применение в коде

WooCommerce не умеет применять купон по ссылке — добавим это сами:

// wp-content/plugins/acme-shop/includes/coupons.php
add_action('template_redirect', function () {
    $code = sanitize_text_field(wp_unslash($_GET['acme_coupon'] ?? ''));
 
    if ($code !== '' && WC()->cart && !WC()->cart->has_discount($code)) {
        WC()->cart->apply_coupon($code);
    }
});

Откройте /cart/?acme_coupon=SPRING15 с товарами в корзине: купон применится, в итогах появится строка скидки. has_discount() не даёт применить один код дважды.

Метод корзиныЧто делает
apply_coupon($code)Применяет купон, возвращает true или false
remove_coupon($code)Снимает купон
get_applied_coupons()Массив применённых кодов
get_discount_total()Сумма скидки по купонам

Собственное условие

Стандартные ограничения — срок, минимальная сумма, категории — задают в панели. Своё условие добавляют фильтром:

// wp-content/plugins/acme-shop/includes/coupons.php
add_filter('woocommerce_coupon_is_valid', function (bool $valid, WC_Coupon $coupon): bool {
    if ($coupon->get_code() !== 'welcome10') {
        return $valid;
    }
 
    if (is_user_logged_in() && wc_get_customer_order_count(get_current_user_id()) > 0) {
        throw new Exception('Купон действует только на первый заказ.');
    }
 
    return $valid;
}, 10, 2);

Фильтр вызывается при каждой проверке купона. Исключение останавливает применение, а его текст покупатель видит как сообщение об ошибке. Код купона WooCommerce хранит в нижнем регистре — сравнивают с welcome10, а не WELCOME10.

Купоны в заказе

foreach ($order->get_coupon_codes() as $code) {
    echo $code;
}

Метод возвращает коды купонов, применённых в оформленном заказе.

Частая ошибка

Скидку «по условию» реализуют купоном, который код сам применяет к каждой корзине, и удивляются, что покупатель может его снять. Купон — то, что покупатель вводит сам. Автоматическую скидку делают отрицательным сбором через add_fee() из урока о сборах.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.