Почему автоматическое создание купонов полезно в WooCommerce
Автоматическая генерация купонов при заказе помогает стимулировать повторные покупки и повышает лояльность клиентов. Вместо ручного создания скидок можно настроить систему, которая сама выдаст купон с уникальным кодом после успешного оформления заказа.
Диагностика задачи: когда и как создавать купоны автоматически
Чаще всего нужно создать купон после:
- завершения оплаты заказа;
- достижения определённой суммы заказа;
- покупки определённого товара или категории;
- выполнения других бизнес-условий.
Важно чётко определить логику генерации и параметры купона: размер скидки, срок действия, ограничения.
Пошаговое решение: реализация автоматического создания купонов через код
1. Подключение к хуку смены статуса заказа
Для начала нужно использовать хук woocommerce_order_status_completed, чтобы отследить момент завершения заказа:
add_action('woocommerce_order_status_completed', 'create_discount_coupon_for_order');2. Функция создания купона
Внутри функции создаём купон с уникальным кодом и параметрами скидки:
function create_discount_coupon_for_order($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
// Уникальный код купона: COUPON-номер_заказа-метка времени
$coupon_code = 'COUPON-' . $order_id . '-' . time();
// Проверяем, не создавался ли уже купон для этого заказа
if (get_post_meta($order_id, '_generated_coupon', true)) return;
$amount = '10'; // Размер скидки в процентах
$discount_type = 'percent'; // Тип скидки: percent, fixed_cart, fixed_product
$coupon = array(
'post_title' => $coupon_code,
'post_content' => '',
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'shop_coupon'
);
$new_coupon_id = wp_insert_post($coupon);
// Настраиваем параметры купона
update_post_meta($new_coupon_id, 'discount_type', $discount_type);
update_post_meta($new_coupon_id, 'coupon_amount', $amount);
update_post_meta($new_coupon_id, 'individual_use', 'yes');
update_post_meta($new_coupon_id, 'usage_limit', '1');
update_post_meta($new_coupon_id, 'expiry_date', date('Y-m-d', strtotime('+30 days')));
update_post_meta($new_coupon_id, 'apply_before_tax', 'yes');
update_post_meta($new_coupon_id, 'free_shipping', 'no');
// Связываем купон с заказом, чтобы не создавать несколько
update_post_meta($order_id, '_generated_coupon', $coupon_code);
// Отправляем купон на email покупателю
$to = $order->get_billing_email();
$subject = 'Ваш персональный купон на следующую покупку';
$message = "Спасибо за заказ! Ваш купон на скидку: $coupon_code. Срок действия 30 дней.";
wp_mail($to, $subject, $message);
}Проверка результата после внедрения
- Оформите тестовый заказ и установите статус «Завершён» вручную, если оплата в тестовом режиме не срабатывает.
- Проверьте, создался ли купон в разделе WooCommerce » Купоны.
- Убедитесь, что купон содержит правильные параметры (размер скидки, срок действия).
- Проверьте, получил ли покупатель email с купоном.
- Попробуйте применить купон при следующей покупке, чтобы проверить корректность скидки.
Частые ошибки и как их исправить
- Купон создаётся несколько раз для одного заказа
Причина: отсутствие проверки в метаданных заказа. Решение: использовать мета-поле, например_generated_coupon, чтобы избежать дублирования. - Письмо с купоном не отправляется
Причина: проблемы с настройкой почты на сервере.
Решение: проверить работуwp_mail()или настроить SMTP-плагин. - Купон не активен или не применяет скидку
Причина: неправильные параметры купона (например, неверный тип скидки или дата истечения).
Решение: убедиться в корректностиdiscount_type,coupon_amountи формата даты. - Сбой при создании купона из-за отсутствия прав
Причина: пользователь, под которым выполняется код, не имеет прав на создание купонов.
Решение: убедиться, что код запускается от имени администратора или нужной роли.
Практические советы по безопасности и производительности
- Не создавайте купон при каждом изменении статуса, а только при переходе в «завершён».
- Ограничьте использование купонов индивидуальным применением (
individual_use). - Храните уникальный код купона в мета-поле заказа, чтобы избежать повторных генераций.
- Для больших магазинов рассмотрите создание купонов с ограничением по времени и количеству использования.
- Для рассылки email используйте SMTP-сервисы для надежной доставки.
Альтернативы: плагин vs код
| Метод | Плюсы | Минусы |
|---|---|---|
| Код на PHP | Гибкость, контроль, нет лишних плагинов | Требует навыков, поддержка и обновления — на вас |
| Плагины автоматизации купонов (например, Advanced Coupons) | Простота, готовые настройки, поддержка | Нагрузка на сайт, возможные конфликты, плата за премиум |