Примените скидку только на второй товар в корзине Woocommerce.

Как получить и изменить цену второго товара в корзине?

Я хочу сделать скидку -3% на второй товар (товары в корзине уже отсортированы по цене, верхний верх).

Думаю, надо рассчитывать в woocommerce_before_calculate_totals или как скидку в woocommerce_cart_calculate_fees?

Спасибо


person Bogdan    schedule 22.07.2017    source источник


Ответы (1)


Обновлено (добавлена ​​совместимость с Woocommerce 3+)

Для товарной позиции лучше использовать хук действия woocommerce_before_calculate_totals:

add_action( 'woocommerce_before_calculate_totals', 'discount_on_2nd_cart_item', 10, 1 );
function discount_on_2nd_cart_item( $cart ) {

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

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Initialising
    $count = 0;
    $percentage = 3; // 3 %

    // Iterating though each cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        $count++;
        if( 2 == $count){ // Second item only
            $price = $cart_item['data']->get_price(); // product price
            $discounted_price = $price * (1 - ($percentage / 100)); // calculation

            // Set the new price
            $cart_item['data']->set_price( $discounted_price );
            break; // stop the loop
        }
    }
}

Или используя скидку на корзину (отрицательная комиссия за корзину):

add_action( 'woocommerce_cart_calculate_fees', 'discount_on_2nd_cart_item', 10, 1 );
function discount_on_2nd_cart_item( $cart ) {

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

    // Initialising
    $count = 0;
    $percentage = 3; // 3 %

    // Iterating though each cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        $count++;
        if( 2 == $count){ // Second item only
            $price = $cart_item['data']->get_price(); // product price
            $discount = $price * $percentage / 100; // calculation
            $second_item = true;
            break; // stop the loop
        }
    }
    if( isset($discount) && $discount > 0 )
        $cart->add_fee( __("2nd item 3% discount", 'woocommerce'), -$discount );
}

Код находится в файле function.php вашей активной дочерней темы (или темы) или также в любом файле плагина.

Этот код протестирован и работает.

person LoicTheAztec    schedule 22.07.2017
comment
код отлично работает, но только если два элемента не совпадают. При выборе двух товаров с одинаковым идентификатором скидка не применяется. - person ToTech; 01.10.2018
comment
@ToTech Этот код основан не на количестве товаров, а на количестве товаров в корзине. Для количества товаров в корзине код должен быть другим. - person LoicTheAztec; 01.10.2018
comment
@LoicTheAztec у вас есть пример количества товаров в корзине? - person FilipeOS; 28.02.2019
comment
@FilipeOS Выполните поиск в этих потоках - person LoicTheAztec; 28.02.2019