Agregue automáticamente un producto específico al carrito según el recuento de otros artículos del carrito en Woocommerce

4 minutos de lectura

avatar de usuario
phil m

Estoy tratando de agregar un producto llamado (Cargo de envío) al carrito según la cantidad de productos que tengo en el carrito.

Ejemplo de carrito:

Producto A (CANT 5)
Producto B (CANT 2)
Producto C (CANT 4)
Cargo por envío (CANTIDAD 3) **Este es 3 porque ese es el total de artículos de línea que se deben contar y que se agregaron al carrito antes de que se agregara el producto con cargo por envío.

Tener problemas con mi código:

/* Function to get total Products (line items) not qty of each */
function count_item_in_cart() {
    global $woocommerce; 
    $counter = 0; 

    foreach ($woocommerce->cart->get_cart() as $cart_item_key => $cart_item) {
        $counter++;
    }
    return $counter;
}

/* Add DC (Delivery Charge Product) to Cart based on qty */ 
add_action( 'template_redirect', 'delivery_charge_add_product_to_cart' ); 
function delivery_charge_add_product_to_cart() {
    /* Establish Product Delivery Charge Product ID */
    global $woocommerce;
    $product_id = 4490;  /* Product ID to add to cart */
    $quantity = count_item_in_cart(); 

    if ($quantity > 0) {
        WC()->cart->add_to_cart( $product_id, $quantity); 
    }
}

Siempre devuelve un número mayor. Creo que está contando la CANTIDAD de cada producto y no el artículo del producto real.

¡Cualquier ayuda sería apreciada!

avatar de usuario
LoicTheAztec

El siguiente código agregará/actualizará automáticamente su producto adicional “Cargo de envío” al carrito cada vez que se agregue un producto al carrito y manejará todos los casos posibles:

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

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

    $dcharge_id  = 4490; // Product Id "Delivery charge" to be added to cart
    $items_count = 0;  // Initializing

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        // Check if "Delivery charge" product is already in cart
        if( $cart_item['data']->get_id() == $dcharge_id ) {
            $dcharge_key = $cart_item_key;
            $dcharge_qty = $cart_item['quantity'];
        }
        // Counting other items than "Delivery charge"
        else {
            $items_count++;
        }
    }

    // If product "Delivery charge" is in cart, we check the quantity to update it if needed
    if ( isset($dcharge_key) && $dcharge_qty != $items_count ) {
        $cart->set_quantity( $dcharge_key, $items_count );
    }
    // If product "Delivery charge" is not in cart, we add it
    elseif ( ! isset($dcharge_key) && $items_count > 0 ) {
        $cart->add_to_cart( $dcharge_id, $items_count );
    }
}

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

  • ¡Excelente! ¡Intentaré esto y te responderé!

    – Phil M.

    24 de enero de 2019 a las 21:07

  • ¿Sabe cómo podría agregar el cargo de envío “al enviar” de la página “Pagar” solo para que no sea visible para el usuario? ¿Solo se muestra como una línea de pedido después de hacer clic en el pago y se les redirige a la página de agradecimiento? Entonces, ¿todavía se agrega al carrito pero no hasta que hacen clic en el último botón de pago?

    – Phil M.

    29 de enero de 2019 a las 3:28

  • Como su cargo de envío es un producto relacionado con el evento de agregar al carrito y como es un artículo del carrito en sí mismo, no veo ninguna forma de hacer lo que le gustaría. Hay muchas otras formas de agregar un cargo de envío y tendrá que explorar esas otras formas que pueden estar relacionadas con woocommerce_package_rates gancho o para woocommerce_cart_calculate_fees gancho, por lo que no utilizar un producto como cargo de envío.

    – LoicTheAztec

    29 de enero de 2019 a las 4:32

  • Bien, ¡gracias de nuevo! ¡Una gran ayuda!

    – Phil M.

    29 de enero de 2019 a las 4:49

  • Me encontré con un problema con la forma en que agregamos el cargo de envío al carrito por producto. Cuando está en la página del carrito, si alguien elimina un artículo, no está actualizando la cantidad de gastos de envío. ¿Tendría un código que pueda eliminar el artículo si se elimina un artículo del carrito? ¡Cualquier ayuda sería muy apreciada!

    – Phil M.

    04/04/2019 a las 18:35

¿Ha sido útil esta solución?