Скидка WooCommerce: купите одну, получите скидку 50% с уведомлением

После моего предыдущего вопроса WooCommerce скидка: купи одну, получи одну 50% выкл. Я хочу добавить пользовательское уведомление в корзину, когда в корзину добавляется определенный продукт (не все продукты).

Сначала я хочу проверить количество, если оно равно 1, то я хочу отобразить уведомление об увеличении количества этого продукта. Я сам кое-что нашел из Интернета и не думаю, что мое решение правильное:

add_action( 'wp', 'sp_custom_notice' );
function sp_custom_notice() {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    
    //to display notice only on cart page
    if ( ! is_cart() ) {
        return;
    }

    global $product;

    $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;
    if($product_id == 15730){
        //check for quantify if equal to 1 in cart


        wc_clear_notices();
        wc_add_notice( __("Add one more to get 50% off on 2nd product"), 'notice');
    }
}

Будет здорово, если кто-нибудь сможет мне в этом помочь.


person abdul    schedule 27.09.2017    source источник


Ответы (2)


Обновлено июль 2020 г.

Если вы все еще используете код из моего ответа на ваш предыдущий вопрос, вы можете немного изменить его, чтобы он тоже работал:

add_action('woocommerce_cart_calculate_fees', 'add_custom_discount_2nd_at_50', 10, 1 );
function add_custom_discount_2nd_at_50( $cart ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) 
        return;

    // YOUR SETTINGS:
    $targeted_product_id = 40; // Set HERE your targeted product ID

    // Initializing variables
    $discount = $qty_notice = 0;
    $items_prices = array();

    // Loop through cart items
    foreach ( $cart->get_cart() as $key => $cart_item ) {
        if( in_array( $targeted_product_id, [$cart_item['product_id'], $cart_item['variation_id']] ) ){
            $quantity = (int) $cart_item['quantity'];
            $qty_notice += $quantity;
            for( $i = 0; $i < $quantity; $i++ ) {
                $items_prices[] = floatval( $cart_item['data']->get_price());
            }
        }
    }

    $count_items = count($items_prices); // Count items

    rsort($items_prices); // Sorting prices descending order

    if( $count_items > 1 ) {
        foreach( $items_prices as $key => $price ) {
            if( $key % 2 == 1 )
                $discount -= number_format( $price / 2, 2 );
        }
    }

    // Applying the discount
    if( $discount != 0 ){
        $cart->add_fee('Buy one get one 50% off', $discount );

        // Displaying a custom notice (optional)
        wc_clear_notices(); // clear other notices on checkout page.
        if( ! is_checkout() ){
            wc_add_notice( __("You get 50% of discount on the 2nd item"), 'notice');
        }
    }
    //  Display a custom notice on cart page when quantity is equal to 1.
    elseif( $qty_notice == 1 ){
        wc_clear_notices(); // clear other notices on checkout page.
        if( ! is_checkout() ){
            wc_add_notice( __( "Add one more to get 50% off on 2nd item" ), 'notice');
        }
    }
}

Код находится в файле functions.php вашей активной дочерней темы (или активной темы) Протестировано и работает.

Примечание. Функция wc_add_notice() не требует повторения

person LoicTheAztec    schedule 27.09.2017
comment
еще раз спасибо за спасение, ты классный ... :) @loictheaztec - person abdul; 28.09.2017
comment
@LoicTheAztec: Привет, Лоик. Какие изменения я должен внести, чтобы это работало по-другому. Я хочу применить скидку, если в корзине есть три варианта товара. Я хочу вычесть 7,5 долларов из общей суммы. У меня есть три варианта запуска, но изменение $price / 2 на $price - 7.5 действительно сработало, как я думал. Должен ли я опубликовать это в новом вопросе? - person inspirednz; 25.08.2020
comment
@LoicTheAztec - Я закончил тем, что создал новый вопрос, так как понял, что это слишком сложно обрабатывать в комментарии. stackoverflow.com/q/63570504/1092677 - person inspirednz; 25.08.2020

Вы сделали довольно хороший код, требуются некоторые незначительные изменения, попробуйте следующий код:

add_action('woocommerce_before_cart', 'sp_custom_notice');
function sp_custom_notice() {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    //to display notice only on cart page
    if ( ! is_cart() ) {
     return;
    }

   global $woocommerce;
    $items = $woocommerce->cart->get_cart();
        foreach($items as $item => $values) { 
            $_product =  wc_get_product( $values['data']->get_id()); 

            if($values['data']->get_id() == 190 && $values['quantity'] == 1 ){
                wc_clear_notices();
                echo wc_add_notice( __("Add one more to get 50% off on 2nd product"), 'notice');
            }
        } 
}
person A Shah    schedule 27.09.2017
comment
спасибо, но сначала я хочу проверить количество. @akshayshah - person abdul; 27.09.2017
comment
проверьте сейчас пожалуйста - person A Shah; 27.09.2017
comment
Я использую плагин с именем snippets для размещения кода, в основном я использую этот плагин для размещения кода, и он действительно работает. Но я не знаю, почему этот код не работает. - person abdul; 27.09.2017
comment
Нет, нам это нужно - person A Shah; 27.09.2017