Существует ли Woocommerce hook, который срабатывает при применении купона, но до проверки его действительности?

Вопрос или проблема

Я хочу добавить товар в корзину (этот же товар получает скидку с купоном) при использовании купонного кода (с использованием хука).

Например, при использовании купонного кода SAMPLECODE, в корзину добавляется товар со скидкой $2. Купон настроен на применение скидки $2 только для этого товара.

Проблема в том, что мой купонный код применяется только к товару, который будет добавлен программно, поэтому он не проходит проверку на соответствие и не доходит до woocommerce_applied_coupon.

Есть ли хук, который срабатывает до проверки действительности купона?

Или мне просто сделать это через JavaScript при применении купона? Можно ли сделать это через AJAX?

Это фильтр woocommerce_get_shop_coupon_data, пример кода:

add_filter ( 'woocommerce_get_shop_coupon_data', 'mp_create_coupon', 10, 2  );
 
function mp_create_coupon( $data, $code ) {
    // Проверка, создан ли купон уже в базе данных
    global $wpdb;
    $sql = $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type="shop_coupon" AND post_status="publish" ORDER BY post_date DESC LIMIT 1;", $code );
    $coupon_id = $wpdb->get_var( $sql );
    if ( empty( $coupon_id ) ) {
        // Создайте купон с необходимыми свойствами
        $data = array(
            'discount_type'              => 'fixed_cart',
            'coupon_amount'              => 100, // значение
            'individual_use'             => 'no',
            'product_ids'                => array(),
            'exclude_product_ids'        => array(),
            'usage_limit'                => '',
            'usage_limit_per_user'       => '1',
            'limit_usage_to_x_items'     => '',
            'usage_count'                => '',
            'expiry_date'                => '2018-09-01', // ГГГГ-ММ-ДД
            'free_shipping'              => 'no',
            'product_categories'         => array(),
            'exclude_product_categories' => array(),
            'exclude_sale_items'         => 'no',
            'minimum_amount'             => '',
            'maximum_amount'             => '',
            'customer_email'             => array()
        );
        // Сохраните купон в базе данных
        $coupon = array(
            'post_title' => $code,
            'post_content' => '',
            'post_status' => 'publish',
            'post_author' => 1,
            'post_type' => 'shop_coupon'
        );
        $new_coupon_id = wp_insert_post( $coupon );
        // Запишите значения $data в таблицу postmeta
        foreach ($data as $key => $value) {
            update_post_meta( $new_coupon_id, $key, $value );
        }
    }
    return $data;
}

Ответ или решение

Для решения поставленной задачи, необходимо добавить товар в корзину при вводе кода купона, который также предоставляет скидку на данный товар, до проверки купона на валидность. Это возможно сделать с помощью системы хуков и фильтров WooCommerce, если подойти к вопросу осмотрительно и профессионально.

Теоретическая часть

Основываясь на предоставленном описании задачи, необходимо использовать хук, который срабатывает до проверки купона на валидность. Фильтр woocommerce_get_shop_coupon_data позволяет вам определить данные для купона на раннем этапе, до выполнения стандартных проверок WooCommerce. Это делает его подходящим инструментом для наших целей. Путем перехвата данных купона на этом этапе, мы можем реализовать свою логику добавления товара в корзину.

Пример использования

Предположим, у вас есть купон кодом SAMPLECODE, который должен добавить определённый товар в корзину и предоставить на него скидку в размере $2. Ваш код может выглядеть следующим образом:

add_filter('woocommerce_get_shop_coupon_data', 'custom_coupon_logic', 10, 2);

function custom_coupon_logic($data, $code) {
    if ($code === 'SAMPLECODE') {
        // Проверка, выходит ли пользователь из системы (например, действующий клиент)
        if (!is_user_logged_in()) {
            return $data;
        }

        // Определите логическую цепочку для добавления товара
        $product_id_to_add = 123; // Укажите ID вашего товара
        $cart = WC()->cart;

        // Добавляем товар в корзину, если его еще нет
        if (!$cart->find_product_in_cart($cart->generate_cart_id($product_id_to_add))) {
            $cart->add_to_cart($product_id_to_add);
        }

        // Обновляем информацию о купоне
        $data = array(
            'discount_type' => 'fixed_cart',
            'coupon_amount' => 2, // Размер скидки
            'individual_use' => false,
            'product_ids' => array($product_id_to_add), // Купон действует только для указанного товара
            'exclude_product_ids' => array(),
            'usage_limit' => 1,
            'usage_limit_per_user' => 1,
            'limit_usage_to_x_items' => 1,
            'usage_count' => 0,
            'expiry_date' => '', // Установите дату окончания действия купона, если требуется
            'free_shipping' => false,
            'product_categories' => array(),
            'exclude_product_categories' => array(),
            'exclude_sale_items' => false,
            'minimum_amount' => 0,
            'maximum_amount' => 100,
            'customer_email' => array()
        );
    }
    return $data;
}

Применение

В данном контексте фильтр woocommerce_get_shop_coupon_data позволяет вам динамически изменять данные купона на стадии их получения из базы данных. Этот подход работает для создания новых купонов "на лету", не нарушая основной поток проверки WooCommerce.

  1. Добавление товара в корзину: Код выше добавляет указанный товар при попытке использовать купон. Это позволяет обойти проблему, когда купон недействителен, потому что товар еще не в корзине.

  2. Обновление данных купона: Мы создаем или обновляем данные купона, чтобы он применялся только к вновь добавленному товару.

  3. Управление пользователями: Поскольку вы можете настроить фильтр для различных категорий пользователей, это позволяет избежать использования купона неавторизованными пользователями или другими нежелательными сценариями.

Заключение

Предлагаемый подход позволяет решить проблему с применением купона через использование фильтра woocommerce_get_shop_coupon_data. Это более близко к идеальному решению с использованием PHP, нежели задействование клиентской логики через JavaScript и AJAX, которые рискуют нарушить стандарты безопасности и производительности вашего магазина. Используя серверные механизмы, такие как хуки и фильтры WooCommerce, вы обеспечиваете более надежное и удобное управление данными корзины и купонов.

Оцените материал
Добавить комментарий

Капча загружается...