Как применить код купона на товар в заказе (order) woocommerce с помощью кода

    Если я правильно понял, то вам нужно при покупки добавлять купон со скидкой.
    Для этого должны быть активированы купоны(в админке) у плагина woocommerce.

    Приведу пример кода, который добавит скидку с купоном, если сумма заказа более 5000

    
    add_action( 'woocommerce_before_cart', 'apply_matched_coupons' );
    function apply_matched_coupons() {
    
    global $woocommerce;
    $coupon_code = '10_coupon'; // Код купона
    if ( $woocommerce->cart->has_discount( $coupon_code ) ) return;
    if ( $woocommerce->cart->cart_contents_total >= 5000 ) {
    
    $woocommerce->cart->add_discount( $coupon_code );
    
    $woocommerce->show_messages();
    
    }
    }
    
    

    10_coupon — название вашего купона.

    Добавить Комментарий

    А если добавлять всегда (независимо от суммы) в коде, который представлен выше в другом вопросе?

    Значит следующее условие нужно удалить:

    
    if ( $woocommerce->cart->cart_contents_total >= 5000 ) {
    }
    
    

    в 08.02.2016.
    Добавить Комментарий

    Если просто добавить купон к ордеру, смотрите в сторону функции:

    
    /**
    
    * Add coupon code to the order.
    
    *
    
    * @param string $code
    
    * @param int $discount_amount
    
    * @param int $discount_amount_tax "Discounted" tax - used for tax inclusive prices.
    
    * @return int|bool Item ID or false.
    
    */
    
    add_coupon( $code, $discount_amount = 0, $discount_amount_tax = 0 );
    
    

    Применение:

    
    $order->add_coupon( 'название купона', 10, 0 );
    
    

    Добавить Комментарий

    Так делал, но он не применяется к заказу. В информации есть, а как скидку не считает.

    Возможно после добавления купона нужно произвести расчет:

     $order->calculate_shipping();
     $order->calculate_totals();
     

    в 08.02.2016.

    Вот так примерно:

     $order->add_coupon($coupon_code, 99.99);
     $order->set_total(99.99, 'order_discount');
     $order->calculate_totals();
     $order->payment_complete();
     

    в 08.02.2016.
    Добавить Комментарий

    Вот хоть убей, не хочет обновлять ценник))

    Возможно будет не правильно чуть но цену можно изменить способом описанным тут:
    http://onwp.ru/question/kak-v-woocommerce-izmenit-cenu-v-zavisimosti-ot-kolichestva-produktov

    в 08.02.2016.

    Как вариант попробуйте:

     $kupon = new WC_Coupon( 'название_курона');
     $amount = $kupon->get_discount_amount( $product->price );
     $order->add_coupon( 'название_курона', $amount, $amount );
    $order->calculate_shipping();
     $order->calculate_totals();
     

    в 08.02.2016.
    Добавить Комментарий

    RE: Как применить код купона на товар в заказе (order) woocommerce с помощью кода


    🙁
    и получил данные $amount так:
    $kupon = new WC_Coupon('название_курона');
    $amount = $kupon->coupon_amount;
    $order->add_coupon( 'название_курона', $amount, $amount );
    

    так выдает 0:

    $kupon -> get_discount_amount( $product -> price );
    

    возможно проблема с купонами??? я делал Посчитать итог в обзоре заказа — купон не читает. Стоимость остается той же

    Добавить Комментарий

    А ценник изменить в order нельзя? потому что по задумке ценник задается из переменной (она считается как калькулятор)

    Просто цену, я писал выше:
    http://onwp.ru/question/kak-v-woocommerce-izmenit-cenu-v-zavisimosti-ot-kolichestva-produktov

    А в настройка вукоммерса купоны активированы? Купон сам создан, с ценой скидки? Название купона правильное? Цена скидки как в купоне?
    Сумма скидки и название купона должны совпадать, как в коде так и в настройках.

    в 08.02.2016.
    Добавить Комментарий

    Про цену это же в functions, а в order как?

     foreach ( $cart_object->cart_contents as $key => $value ) {
     if($value['quantity'] > 5){
     $discount = $value['data']->price * 0.10;
     $value['data']->price = $value['data']->price - $discount;
     }
     

    А по купону верно все, название же ввожу, а остальные параметры он берет сам, в настройках купоны включены:

     $kupon = new WC_Coupon('название_курона');
     $amount = $kupon->coupon_amount;
     $order->add_coupon( 'название_курона', $amount, $amount );
     

    У Вас работает?

    У вас в админке купон называется «название_курона»?

    Этот код срабатывает когда вызывается расчет calculate_totals и если более 5 продуктов покупается, то считаем скидку и вычитаем ее из основной цены.

    в 08.02.2016.
    Добавить Комментарий

    В админке у меня 111111
    это я тут для примера написал

    Добавить Комментарий

    «Этот код срабатывает когда вызывается расчет calculate_totals и если более 5 продуктов покупается, то считаем скидку и вычитаем ее из основной цены.»

    это я понимаю, но я же делаю Заказ (order) на своей отдельной странице. Там у меня идет форма с калькулятором. Поэтому цена всегда разная генерируется, в зависимости от выбранных параметров.

    А что тогда мешает со своей формы передать параметр в котором будет правильная цена и сразу ее указать при создании ордера?

    в 08.02.2016.
    Добавить Комментарий

    Передать параметр в functions.php?

    в cart или в вашу функцию которая начинает создавать ордер.

    в 09.02.2016.
    Добавить Комментарий

    Дело в том, что я не понимаю, как мне в функции, которая order создает передать параметр цены. То что выше для functions.php не работает..в функции создания order, а если вставлять в functions.php то работает в корзине.

    Подскажите как мне в order добавить?))))

    сейчас такой код

    $product = '614';
    // Добавляем новый заказ, он пустой, потом будем добавлять в него данные
    $order_args = array(
    'status' => '',
    'customer_id' => null, // id пользователя который сделал заказ
    'customer_note' => null,
    'order_id' => 0,
    'created_via' => '',
    'parent' => 0
    );
    $order = wc_create_order($order_args);
    // Получаем и сразу же добавляем данные о продукте который покупает пользователь get_current_user_id()
    $order->add_product(get_product($product), 1);
    // Заполняем информацию о пользователе который сделал покупку и информацию о доставке
    $address_billing = array(
    'first_name' => get_user_meta(get_current_user_id(), 'billing_first_name', true),
    'last_name' => get_user_meta(get_current_user_id(), 'billing_last_name', true),
    'company' => get_user_meta(get_current_user_id(), 'billing_company', true),
    'email' => get_user_meta(get_current_user_id(), 'billing_email', true),
    'phone' => get_user_meta(get_current_user_id(), 'billing_phone', true),
    'address_1' => get_user_meta(get_current_user_id(), 'billing_address_1', true),
    'address_2' => get_user_meta(get_current_user_id(), 'billing_address_2', true),
    'city' => get_user_meta(get_current_user_id(), 'billing_city', true),
    'state' => get_user_meta(get_current_user_id(), 'billing_state', true),
    'postcode' => get_user_meta(get_current_user_id(), 'billing_postcode', true),
    'country' => get_user_meta(get_current_user_id(), 'billing_country', true)
    );
    $address_shipping = array(
    'first_name' => get_user_meta(get_current_user_id(), 'shipping_first_name', true),
    'last_name' => get_user_meta(get_current_user_id(), 'shipping_last_name', true),
    'company' => get_user_meta(get_current_user_id(), 'shipping_company', true),
    'address_1' => get_user_meta(get_current_user_id(), 'shipping_address_1', true),
    'address_2' => get_user_meta(get_current_user_id(), 'shipping_address_2', true),
    'city' => get_user_meta(get_current_user_id(), 'shipping_city', true),
    'state' => get_user_meta(get_current_user_id(), 'shipping_state', true),
    'postcode' => get_user_meta(get_current_user_id(), 'shipping_postcode', true),
    'country' => get_user_meta(get_current_user_id(), 'shipping_country', true)
    );
    $order->set_address($address_billing, 'billing');
    $order->set_address($address_shipping, 'shipping');
    //Добавление доп.полей
    if ( sizeof( $order->get_items() ) > 0 ) {
    foreach ( $order->get_items() as $id => $item ) {
    wc_update_order_item_meta( $id, '_random_number', rand() );
    // или wc_add_order_item_meta()
    }
    }
    // Добавим статус "платеж выполнен"
    //$order->update_status('processing');
    // данные о покупке (цена и сниппет под названием)
    $shipping = new stdClass();
    $shipping->label = 'Code pay';
    $shipping->id = 'code_pay';
    $shipping->cost = 100;
    $shipping->taxes = array();
    $order->add_shipping($shipping);
    $kupon = new WC_Coupon('UNIQUECODE');
    $amount = $kupon->coupon_amount;
    $order->add_coupon('UNIQUECODE', $amount, $amount);
    $order->set_total($amount, 'order_discount');
    // Обновим данные о покупке и рассчитаем итоговою стоимость
    $order->calculate_totals();
    $order->calculate_shipping();
    //$order->payment_complete();
    //Редирект на страницу Спасибо!
    payment_redirect($order);
    function payment_redirect($order) {
    // берем класс для рабы в вукомерс с оплатой
    $class_woo = new WC_Gateway_COD();
    // получим данные о платеже
    $url_redirect = $class_woo->get_return_url($order);
    //сосатвим массив
    $arr_json = array(
    "result" => "success",
    "redirect" => $url_redirect
    );
    // вернем правильный ответ в зависимости от типа запроса
    if (is_ajax()) { // если ajax
    echo json_encode($arr_json);
    // echo '<!--WC_START-->{"result":"success","redirect":"' . addslashes($url_redirect) . '"}<!--WC_END-->';
    exit;
    } else {
    wp_redirect($url_redirect);
    exit;
    }
    wp_die();
    }
    

    Данный код ни о чем не говорит.  Я и так представлял что он у вас есть и написан примерно так.
    Я вам предлагал передавать к этому коду переменную, которая например получается при расчетах вашего калькулятора.  и вписывать вместо цены.

    в 09.02.2016.
    Добавить Комментарий

    В этом же коде нет цен…товар же берем, у которого уже есть цена…разве нет? Может я что-то не вижу

    А я вот хочу чтоб «передавать к этому коду переменную, которая например получается при расчетах вашего калькулятора.  и вписывать вместо цены»
    Но как???

    Добавить Комментарий

    Как с Вами еще можно связаться? Есть предложение за оплату

    Email: onlajn@_bk_.ru (без _ )

    Но я бы на вашем месте просто переформулировал бы вопрос.
    Я ведь всего лишь спрашивал после каких действий вы выполняете код.

    в 10.02.2016.
    Добавить Комментарий

    Ваш ответ

    Размещая свой ответ, вы соглашаетесь с правилами сайта.