Купоны
Купон — код, который покупатель вводит в корзине и получает скидку. В панели купоны создают в «Маркетинг → Купоны», а в коде это объект 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() из урока о сборах.