Диагностика задачи: зачем автоматизировать создание промо-кодов
В интернет-магазинах на WooCommerce часто требуется выдавать уникальные промо-коды для акций, рассылок или бонусов. Ручное создание множества кодов неудобно и занимает время. Кроме того, важно отслеживать, кто и когда использовал конкретный код, чтобы избежать мошенничества и проанализировать эффективность кампаний.
Пошаговое решение: как автоматически создавать промо-коды с сохранением истории использования
1. Создаем функцию генерации уникальных кодов
Для начала напишем PHP-функцию, которая создаст случайный код определенной длины. Код должен быть уникальным в базе купонов WooCommerce.
function generate_unique_coupon_code( $length = 8 ) {
$characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$code = '';
for ( $i = 0; $i < $length; $i++ ) {
$code .= $characters[ wp_rand( 0, strlen( $characters ) - 1 ) ];
}
// Проверяем уникальность
if ( post_exists( $code, '', '', 'shop_coupon' ) ) {
return generate_unique_coupon_code( $length );
}
return $code;
}2. Автоматическое создание купона с метаданными
Далее создадим купон с параметрами скидки (например, 10% скидка), установим дату окончания и добавим пользовательские метаданные для истории использования.
function create_automatic_coupon() {
$coupon_code = generate_unique_coupon_code();
$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, 'usage_limit_per_user', '1' );
update_post_meta( $new_coupon_id, 'date_expires', strtotime( '+7 days' ) );
// Создаем мета для истории использования
update_post_meta( $new_coupon_id, '_usage_history', array() );
return $coupon_code;
}3. Логирование использования купона
Для отслеживания кто и когда использовал купон, добавим слушатель на событие оформления заказа. При использовании купона добавим запись в метаданные купона.
add_action( 'woocommerce_order_status_completed', 'log_coupon_usage_history' );
function log_coupon_usage_history( $order_id ) {
$order = wc_get_order( $order_id );
$used_coupons = $order->get_used_coupons();
foreach ( $used_coupons as $coupon_code ) {
$coupon = new WC_Coupon( $coupon_code );
$coupon_id = $coupon->get_id();
$usage_history = get_post_meta( $coupon_id, '_usage_history', true );
if ( ! is_array( $usage_history ) ) {
$usage_history = array();
}
$usage_history[] = array(
'order_id' => $order_id,
'user_id' => get_current_user_id(),
'date' => current_time( 'mysql' ),
'email' => $order->get_billing_email()
);
update_post_meta( $coupon_id, '_usage_history', $usage_history );
}
}Проверка результата после внедрения
- Вызовите функцию
create_automatic_coupon()через админский хук или CLI, чтобы сгенерировать новый купон. Убедитесь, что он появился в списке купонов WooCommerce с корректными параметрами и сроком действия. - Сделайте тестовый заказ, используя созданный купон, и завершите его.
- Проверьте метаданные купона в базе (через phpMyAdmin или плагин типа WP All Export). В поле
_usage_historyдолжна появиться запись с информацией о заказе и пользователе.
Частые ошибки и как их исправить
- Купон не создается или дублируется. Проверьте, что функция
generate_unique_coupon_code()корректно проверяет уникальность. Иногдаpost_exists()не учитывает нестандартные post_type, тогда используйте WP_Query с параметромpost_type="shop_coupon". - История использования не сохраняется. Убедитесь, что хук
woocommerce_order_status_completedсрабатывает. Если нет, попробуйтеwoocommerce_checkout_order_processedилиwoocommerce_order_status_processing. - Купон не применяется к заказу. Проверьте настройки скидки: тип, срок действия, лимиты, статус заказа. Ручное тестирование в админке помогает выявить ограничения.
Практические советы по безопасности и производительности
- Сохраняйте историю использования купонов в виде сериализованного массива в метаданных. Если ожидается большое количество записей, рассмотрите хранение в отдельной таблице для масштабируемости.
- Используйте nonce и проверки прав пользователя при автоматическом создании купонов из админки, чтобы предотвратить несанкционированный доступ.
- При массовом создании промо-кодов ставьте ограничения по скорости или разбивайте процесс на партии, чтобы не перегружать сервер.
- Для визуализации истории используйте кастомные колонки в списке купонов или отдельный метабокс с пагинацией.
Сравнение вариантов реализации автоматического создания промо-кодов
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| Ручной ввод | Простота, контроль | Время, ошибки | Отсутствует |
| Плагин (например, Smart Coupons) | Готовое решение, интерфейс | Зависимость, цена | Не рассматривается |
| Код на PHP (как в статье) | Гибкость, интеграция | Требует знаний, поддержка | Приведён выше |