Купон и порядок расчёта скидки
Купон меняет расчёт по определённому правилу и в определённой области применения. Код LAB10 сам по себе не объясняет, какие товары участвуют, можно ли совмещать скидки и сколько раз использовать предложение. Для «Полки» создадим процентный купон на десять процентов и разберём его на известной корзине 12 + 8.
После урока pair scenario должен дать subtotal 20.00 и total 18.00 при выполненных ограничениях. Products, downloads и состояние оплаты сохраняются. Купон и checkout не создавались при подготовке курса, поэтому арифметика является ожидаемым контрактом, а не измеренной продажей.
Тип скидки определяет результат
В WooCommerce Settings → General разрешите использование coupon codes. Затем Marketing → Coupons создайте LAB10. Выберите Percentage discount и amount 10 без знака процента. Fixed cart и Fixed product означают другие правила; одинаковое число в поле amount не делает их эквивалентными.
Для пары GRID-PDF/FORM-ZIP процентная скидка десять даёт два условных USD. Fixed cart amount десять дал бы 10.00 итоговой скидки на корзину, а fixed product десять имел бы свою семантику на eligible items. Поэтому в лаборатории сначала читают тип, затем число. Название LAB10 не должно служить единственным источником правила.
Текущие типы и поля описаны в Coupon Management. Наш небольшой набор условий задан специально для course; он не гарантирует прибыльность акции или соответствие реальному коммерческому договору. Здесь нет marketing campaign, оплаченного traffic и покупателей вне лаборатории.
Ограничения сохраняют область предложения
В Usage Restrictions задайте minimum spend 10.00, включите Individual use only и Exclude sale items. Выберите товары учебного каталога, включая variations там, где выбранный interface позволяет нужную область. Для простой проверки достаточно pair GRID-PDF/FORM-ZIP. Не считайте список SKU готовыми REST IDs: actual Product records создала ваша база.
В Usage Limits задайте общий limit десять и limit per user один. Эти числа удобны для маленького опыта. Реальное значение «пользователь» зависит от способа идентификации и состояния аккаунта; позднее мы отключим guest checkout. Не обещайте, что один checkbox исключает любые способы повторной покупки в реальном магазине.
Файл fixtures/coupons.json фиксирует настройки и allowed SKUs. Это спецификация для UI, а не body, который можно без преобразования отправить в coupon API.
{
"code": "LAB10",
"discount_type": "percent",
"amount": "10",
"individual_use": true,
"exclude_sale_items": true,
"usage_limit": 10,
"usage_limit_per_user": 1,
"minimum_amount": "10.00",
"allowed_skus": [
"GRID-PDF",
"FORM-ZIP",
"URL-TXT",
"HTML-BASIC",
"HTML-EXT"
],
"note": "Не payload REST API: SKU перевести в реальные product/variation IDs либо выбрать товары в UI."
}
Если используете API, перечень SKU сначала переводится в IDs Products/variations по вашему каталогу. В UI выберите соответствующие записи по имени и артикулу. Подмена IDs из чужого sample может дать скидку другому товару, даже если импорт успешно завершится. После сохранения проверьте область, а не только название coupon.
Срок expiry пока можно оставить пустым для course. Если задаёте дату, учитывайте timezone магазина и актуальную семантику окончания. Не ставьте произвольный вчерашний день ради заполненного поля: иначе хороший расчёт будет недоступен из-за неверного времени. В спецификации каждая настройка должна иметь объяснимое назначение.
Сумма и сообщение проверяются вместе
Добавьте GRID-PDF и FORM-ZIP, затем примените LAB10 в Cart Block. Ожидаемый subtotal 20.00, discount 2.00 и total 18.00. На Checkout должны сохраниться тот же coupon и состав. Если сумма отличается, сначала проверьте tax/shipping, prices, sale status и eligible Product IDs. Не меняйте amount coupon случайно, чтобы подогнать неожиданный итог.
Удалите FORM-ZIP: с одним GRID-PDF за 12 minimum spend выполняется, ожидаемый итог 10.80. Оставьте только URL-TXT за 5: minimum spend не выполняется, поэтому coupon должен быть rejected с понятным сообщением. Такие сравнения показывают, что code не является постоянной скидкой на любое состояние корзины.
Если position excluded как sale item, отдельный item может не получить скидку. Тогда total не следует сравнивать с десятью процентами от всей cart без учёта правил. Сначала перечисляют eligible суммы, потом применяют процент. Это особенно важно в mixed catalog, где рядом существуют разные акции и несколько типов товара.
Обратите внимание на message применения. Пользователь должен видеть, принят ли coupon или почему отказано. Не скрывайте уведомление, оставляя только не изменившуюся сумму: человек не поймёт, опечатался ли в коде или не выполнил условие. В блочной корзине notices и coupon form работают как часть общего динамического состояния.
Купон не изменяет каталог задним числом
Regular price GRID-PDF остаётся 12.00. Coupon меняет calculation выбранного order, а не глобальную цену Product. Поэтому тот же товар в другой session без LAB10 продолжает иметь прежнее предложение. Нельзя записывать итог 10.80 обратно в Product price после одного checkout: это подменит правило для всех посетителей.
Order сохраняет applied coupon и свои totals. В reports gross/net sales отличаются из-за скидок и refunds. Мы увидим это в пятнадцатой главе. Если аналитик сравнит current catalog price с total заказа, он может ошибочно принять нормальную скидку за потерянный платёж. Состав расчёта должен оставаться доступным для объяснения.
Individual use запрещает предусмотренное совмещение с другими coupons. Для самостоятельного опыта создайте отдельный временный code на маленькую fixed discount и попробуйте применить его вместе с LAB10. Ожидайте поведение согласно restrictions; после опыта удалите только временный учебный coupon. Не удаляйте историю уже созданных orders ради более чистого отчёта.
Не обещайте купоном бесплатную доставку у магазина, который не имеет shipping items. Такая отметка не несёт полезного смысла в нашем assortment. Чем меньше бессмысленных переключателей, тем легче читателю понять реальную область предложения. Если будущий проект добавит physical goods, shipping discount станет отдельной задачей со своим исходным состоянием.
Конец урока — LAB10 имеет объяснимые тип, число, область и limits; pair cart получает ожидаемые 18.00, маленькая неeligible cart получает понятный отказ. Все результаты ждут вашей локальной проверки. Далее account и локальные email notifications свяжут этот заказ с конкретным вымышленным участником, сохраняя границу между доступом к покупке и административными правами магазина.