Descuento del artículo del carrito basado en la cantidad en Woocommerce 3

6 minutos de lectura

Descuento del articulo del carrito basado en la cantidad en
1amdadmt

Mi sitio WP vende camisetas personalizadas. El complemento de personalización convierte cada camisa personalizada en una línea de pedido en el carrito de Woocommerce. Si hay 2 camisas ordenadas de un diseño (cantidad de 2 en ese artículo de línea) quiero descuento. Pero si solo hay 1 artículo por línea, no quiero descontar.

encontré esta solución

Agregar un descuento por artículos del carrito condicionalmente en función de la cantidad del artículo

Pero esto parece cambiar el precio del producto en la base de datos, por lo que después de que se activa el descuento por ejemplo, 2 camisas azules porque se ordenaron 2 en 1 línea, si agrego una tercera camisa en una línea separada, también obtiene el descuento, que yo no quiero

  • Lo siento, pero el código vinculado no cambia el precio del producto en la base de datos… Solo realiza cálculos basados ​​en artículos del carrito a partir del precio del producto, para establecer un descuento calculado (una tarifa negativa) globalmente en el carrito.

    – LoicTheAztec

    24 de agosto de 2018 a las 19:26


  • Pero lo que encontré cuando ejecuté el código es que si agregaba una tercera camisa azul como otro artículo de línea después de que la línea de 2 artículos se descontara correctamente, la camisa recién agregada también se descontaba, lo cual no quiero.

    – 1amdadmt

    24 de agosto de 2018 a las 20:29

  • Este código no agrega ningún artículo al carrito… Simplemente hace un descuento usando la API Cart Fee… Su problema seguramente se debe a algún otro fragmento de código o un complemento, que lo está haciendo.

    – LoicTheAztec

    24 de agosto de 2018 a las 20:37


  • Tiene razón, hice referencia al fragmento de código incorrecto, este es el fragmento de código que probé stackoverflow.com/questions/42135852/…

    – 1amdadmt

    24/08/2018 a las 20:40


  • Lo mismo para este nuevo código vinculado… No cambia el precio del producto en la base de datos, simplemente cambia el precio del artículo del carrito, y tampoco añade ningún artículo al carrito. Ahora desde woocommerce versión 3.1+ este código ya no funcionay esto debe hacerse de otra manera.

    – LoicTheAztec

    24 de agosto de 2018 a las 21:04

Descuento del articulo del carrito basado en la cantidad en
LoicTheAztec

Desde la versión 3+ de woocommerce el código de respuesta vinculado no funciona. necesita algo diferente e incluso se puede hacer de una mejor manera.

El código aplicará un descuento de artículo del carrito basado en la cantidad del artículo del carrito. En este ejemplo de código, se aplicará un descuento del 5% sobre el artículo del carrito, cuando la cantidad sea igual o superior a 2 (dos).

El precio unitario del artículo del carrito que se muestra es siempre el precio real del producto. El descuento será efectivo y se mostrará en el subtotal del artículo del carrito.

Además, el nombre del producto se adjuntará con una mención de descuento.

El código:

add_filter('woocommerce_add_cart_item_data', 'add_items_default_price_as_custom_data', 20, 3 );
function add_items_default_price_as_custom_data( $cart_item_data, $product_id, $variation_id ){
    $product_id = $variation_id > 0 ? $variation_id : $product_id;

    ## ----- YOUR SETTING ----- ##
    $discount_percentage = 5; // Discount (5%)

    // The WC_Product Object
    $product = wc_get_product($product_id);

    // Only for non on sale products
    if( ! $product->is_on_sale() ){
        $price = (float) $product->get_price();

        // Set the Product default base price as custom cart item data
        $cart_item_data['base_price'] = $price;

        // Set the Product discounted price as custom cart item data
        $cart_item_data['new_price'] = $price * (100 - $discount_percentage) / 100;

        // Set the percentage as custom cart item data
        $cart_item_data['percentage'] = $discount_percentage;
    }

    return $cart_item_data;
}

// Display the product original price
add_filter('woocommerce_cart_item_price', 'display_cart_items_default_price', 20, 3 );
function display_cart_items_default_price( $product_price, $cart_item, $cart_item_key ){
    if( isset($cart_item['base_price']) ) {
        $product        = $cart_item['data'];
        $product_price  = wc_price( wc_get_price_to_display( $product, array( 'price' => $cart_item['base_price'] ) ) );
    }
    return $product_price;
}

// Display the product name with the discount percentage
add_filter( 'woocommerce_cart_item_name', 'append_percetage_to_item_name', 20, 3 );
function append_percetage_to_item_name( $product_name, $cart_item, $cart_item_key ){
    if( isset($cart_item['percentage']) && isset($cart_item['base_price']) ) {
        if( $cart_item['data']->get_price() != $cart_item['base_price'] )
            $product_name .= ' <em>(' . $cart_item['percentage'] . '% discounted)</em>';
    }
    return $product_name;
}

add_action( 'woocommerce_before_calculate_totals', 'custom_discounted_cart_item_price', 20, 1 );
function custom_discounted_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

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

    ## ----- YOUR SETTING ----- ##
    $targeted_qty = 2; // Targeted quantity

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ) {

        // For item quantity of 2 or more
        if( $cart_item['quantity'] >= $targeted_qty && isset($cart_item['new_price']) ){

            // Set cart item discounted price
            $cart_item['data']->set_price($cart_item['new_price']);
        }
    }
}

El código va en el archivo functions.php de su tema secundario activo (o tema activo). Probado y funciona.

ingrese la descripción de la imagen aquí


Para mostrar el precio del producto con descuento en lugar del precio original del producto, simplemente elimine woocommerce_cart_item_price() función (y gancho)

Más nuevo similar: Cantidad de artículo del carrito de descuento porcentual progresivo en Woocommerce 3

  • Esto resolvió el problema exactamente como se describe, muchas gracias. Lo que encontré al probarlo es que la aplicación de personalización modificará el precio base en el carrito, agrega $ 1 por cada línea de texto de más de 16 caracteres, por ejemplo, por lo que el precio en el carrito es $ 20 + $ 1.50 = $ 21.50. Necesito modificar el precio base que tiene ese carrito. Creo que puedo averiguar cómo hacer esto. Gracias por tu ayuda.

    – 1amdadmt

    25 de agosto de 2018 a las 15:25


  • Creo que lo tengo, cambié $product_price = wc_price( wc_get_price_to_display($product, array( ‘price’ => $cart_item[‘base_price’] ) ) ); a $product_price = wc_price( wc_get_price_to_display($product,$cart_item[‘base_price’] ) );

    – 1amdadmt

    25 de agosto de 2018 a las 16:21


  • @LoicTheAztec – es Dios WC. Hombre, muchas gracias por esta decisión. Lo combiné con otra solución (que también compartió), agregué un poco de mi propia solución y, como resultado, obtuve una característica increíble para la tienda WC.

    – Víctor Sokoliuk

    26 oct 2020 a las 10:51


  • @LoicTheAztec ¿por qué la condición did_action(‘woocommerce_before_calculate_totals’) >= 2? ¿Qué soluciona?

    – Radovan Bezak

    5 de octubre de 2021 a las 9:44

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad