WooCommerce: автоматическое создание уникальных промо-кодов с историей использования

Диагностика задачи: зачем автоматизировать создание промо-кодов

В интернет-магазинах на 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 (как в статье)Гибкость, интеграцияТребует знаний, поддержкаПриведён выше
Автоматизация ответов на комментарии в WordPress с использованием AI
24.12.2025
Оптимизация загрузки изображений в WordPress с помощью AI
15.02.2026
Автоматическое создание резервных копий в WordPress: лучшие практические решения
19.11.2025
WooCommerce: автоматическая обработка возвратов с помощью хуков
06.05.2026
Автоматическое создание и обновление картинок для социальных сетей в WordPress с помощью AI
13.01.2026