Aplicar un descuento solo en el segundo artículo del carrito en Woocommerce

2 minutos de lectura

Avatar de usuario de Bogdan
Bogdán

Cómo obtener y modificar el precio del segundo artículo en mi carrito?

Quiero hacer un descuento del -3% en el segundo producto (artículos en el carrito ya ordenados por el precio, el más alto en la parte superior).

Creo que debe calcular en woocommerce_before_calculate_totals o como descuento en woocommerce_cart_calculate_fees?

Gracias

Avatar de usuario de LoicTheAztec
LoicTheAztec

Actualizado (Compatibilidad añadida con Woocommerce 3+)

Para un artículo de producto es mejor usar woocommerce_before_calculate_totals gancho de acción:

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
        }
    }
}

O usando un descuento de carrito (cargo de carrito negativo):

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 );
}

El código va en el archivo function.php de su tema secundario activo (o tema) o también en cualquier archivo de complemento.

Este código está probado y funciona.

  • el código funciona muy bien, pero solo si los 2 elementos no son iguales. Si elige dos artículos con la misma identificación, el descuento no se aplica.

    – ToTech

    1 de octubre de 2018 a las 1:04

  • @ToTech Este código no se basa en el recuento de cantidad de artículos, sino en el recuento de artículos del carrito. Para la cantidad de artículos del carrito, el código deberá ser diferente.

    – LoicTheAztec

    1 oct 2018 a las 2:55


  • @LoicTheAztec, ¿tiene el ejemplo de la cantidad del artículo del carrito?

    – Filipe OS

    28 de febrero de 2019 a las 9:49

  • @FilipeOS Por favor busque en esos hilos

    – LoicTheAztec

    28 de febrero de 2019 a las 9:51

¿Ha sido útil esta solución?