Диагностика задачи: зачем создавать купоны автоматически
В интернет-магазинах на WooCommerce часто возникает необходимость поощрять покупателей — например, выдавать персональные купоны на скидку после успешной покупки. Это повышает лояльность и стимулирует повторные заказы. Однако WooCommerce не предлагает встроенного решения для автоматического создания купонов после оформления заказа.
Задача: после успешного завершения заказа создать уникальный купон с определенными параметрами и отправить его покупателю на email.
Пошаговое решение: создание купона программно через хук
1. Подключение к нужному хук-эвенту
Для реакции на завершение заказа используем хук woocommerce_order_status_completed. Он срабатывает, когда заказ переводится в статус «завершён».
add_action('woocommerce_order_status_completed', 'wpconsult_create_coupon_after_order', 10, 1);2. Функция создания купона
В функции создадим купон с уникальным кодом, ограничением по использованию и фиксированной скидкой 10%.
function wpconsult_create_coupon_after_order($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
$user_email = $order->get_billing_email();
if (!$user_email) return;
// Генерация уникального кода купона
$coupon_code = 'DISCOUNT_' . strtoupper(wp_generate_password(6, false, false));
// Проверяем, что купон не существует
if (get_page_by_title($coupon_code, OBJECT, 'shop_coupon')) {
// Если есть совпадение, добавляем суффикс
$coupon_code .= '_' . wp_rand(100, 999);
}
$amount = '10'; // сумма скидки
$discount_type = 'percent'; // тип скидки: процент
$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, 'usage_limit_per_user', '1');
update_post_meta($new_coupon_id, 'limit_usage_to_x_items', '');
update_post_meta($new_coupon_id, 'free_shipping', 'no');
update_post_meta($new_coupon_id, 'product_ids', '');
update_post_meta($new_coupon_id, 'exclude_product_ids', '');
update_post_meta($new_coupon_id, 'usage_count', '0');
update_post_meta($new_coupon_id, 'expiry_date', '');
update_post_meta($new_coupon_id, 'apply_before_tax', 'yes');
update_post_meta($new_coupon_id, 'customer_email', array($user_email));
// Отправка email с купоном
$subject = 'Ваш персональный купон на скидку 10%';
$message = 'Спасибо за покупку! Используйте купон <strong>' . $coupon_code . '</strong> при следующем заказе, чтобы получить 10% скидку.';
wp_mail($user_email, $subject, $message);
}
3. Размещение кода
Добавьте этот код в файл functions.php вашей дочерней темы или в отдельный плагин для кастомизации.
Проверка результата после внедрения
- Оформите тестовый заказ и переведите его статус в «Завершён».
- Проверьте в админке WooCommerce → Купоны наличие нового купона с уникальным кодом.
- Проверьте почту покупателя — должен прийти email с кодом купона.
- Попробуйте применить купон в корзине — должна работать скидка 10%.
Частые ошибки и как их исправить
- Купон не создаётся: проверьте, что хук
woocommerce_order_status_completedсрабатывает (можно временно добавитьerror_logвнутри функции). - Почта не отправляется: проверьте настройки SMTP и логи почтового сервера. WP по умолчанию использует
wp_mail(), для надежности настройте SMTP через плагин. - Купон создаётся, но не работает: проверьте, что у купона корректные мета-данные, особенно
customer_email— он ограничивает использование купона только на конкретный email. - Повторяющиеся коды купонов: добавьте проверку уникальности, как в примере, или используйте более длинные случайные строки.
Практические советы по безопасности и производительности
- Используйте валидацию данных — например, проверяйте корректность email перед созданием купона.
- Ограничьте срок действия купона, добавив в мета
expiry_dateс датой через 30 дней:
update_post_meta($new_coupon_id, 'expiry_date', date('Y-m-d', strtotime('+30 days')));
- Чтобы избежать нагрузки при большом количестве заказов, используйте кэширование и минимизируйте сложную логику внутри функции создания купона.
- Для более продвинутых сценариев рассмотрите отправку email через очереди (например, с помощью WP-Cron или внешнего сервиса), чтобы не задерживать процесс оформления заказа.
Сравнение подходов: код vs. плагины
| Подход | Преимущества | Недостатки |
|---|---|---|
| Код в functions.php | Полный контроль, нет зависимостей, легко кастомизировать | Требует навыков, возможны ошибки, сложнее поддерживать |
| Плагины (например, WooCommerce Smart Coupons) | Готовые функции, поддержка, интерфейс | Может быть тяжеловесным, не всегда точное соответствие требованиям |