Envío calculado sobre el peso de los artículos del carrito y el monto del carrito

4 minutos de lectura

Envio calculado sobre el peso de los articulos del carrito
espiar

En un sitio web cliente de WooCommerce, el método de envío gratuito está habilitado para pedidos de hasta 250. Utilizo el siguiente código (de esta respuesta)para ocultar otras tarifas de envío cuando el importe del pedido es superior a 250, excepto cuando hay artículos pesados ​​en el carrito.

add_filter( 'woocommerce_package_rates', 'conditionally_hide_other_shipping_based_on_items_weight', 100, 1 );
function conditionally_hide_other_shipping_based_on_items_weight( $rates ) {
    // targeted weight
    $target_product_weight = 12;
    $target_cart_amount = 250;

    WC()->cart->subtotal_ex_tax >= $target_cart_amount ? $passed = true : $passed = false ;

    // Iterating trough cart items to get the weight for each item
    foreach(WC()->cart->get_cart() as $cart_item){
        if( $cart_item['variation_id'] > 0)
            $item_id = $cart_item['variation_id'];
        else
            $item_id = $cart_item['product_id'];

        // Getting the product weight
        $product_weight = get_post_meta( $item_id , '_weight', true);

        if( !empty($product_weight) && $product_weight >= $target_cart_amount ){
            $light_products_only = false;
            break;
        }
        else $light_products_only = true;
    }

    // If 'free_shipping' method is available and if products are not heavy
    // and cart amout up to the target limit, we hide other methods
    $free = array();
    foreach ( $rates as $rate_id => $rate ) {
        if ( 'free_shipping' === $rate->method_id && $passed && $light_products_only ) {
            $free[ $rate_id ] = $rate;
            break;
        }
    }

    return ! empty( $free ) ? $free : $rates;
}

Pero ahora, me gustaría establecer un monto de envío variable que se calculará de 2 maneras:

  • Cuando el importe del pedido sea inferior a 250, el cálculo será de 1 euro por kilo sobre el peso total de los artículos del pedido.
  • Cuando el importe del pedido sea superior a 250, el cálculo se realizará únicamente sobre artículos de gran peso (1 euro el kilo). Si no hay artículos pesados, la tarifa de envío gratis está disponible.

¿Cómo puedo lograr esto, ya que es un poco complicado?
¿Alguna pista a seguir?

He probado algunos complementos relacionados existentes, pero no son convenientes para este caso.

Gracias.

Envio calculado sobre el peso de los articulos del carrito
LoicTheAztec

Código mejorado (en marzo de 2019):

Sí, esto es posible sin un complemento con un personalizado GASTOS DE ENVÍOcalculado sobre el peso de los artículos del carrito y la cantidad del carrito… Pero necesitará tener un 'Flat rate' Método de envío establecer con una cantidad mínima. Esto normalmente debería funcionar con el código que está utilizando.

Aquí está ese código (comentado):

//Adding a custom Shipping Fee to cart based conditionaly on weight and cart amount
add_action('woocommerce_cart_calculate_fees', 'custom_conditional_shipping_fee', 10, 1);
function custom_conditional_shipping_fee( $cart ){

    ## --- YOUR SETTINGS --- ##
    $targeted_weight      = 20;  // Your targeted "heavy" product weight
    $targeted_cart_amount = 250; // Your targeted cart amount
    $price_per_kg         = 1;   // Price by Kg;
    $flat_rate_price      = 10;  // Set the cost like in 'flat rate' shipping method

    // Initializing variables
    $fee = $calculated_weight = 0;

    // For cart SUBTOTAL amount EXCLUDING TAXES
    $passed = $cart->subtotal_ex_tax >= $targeted_cart_amount ? true : false ;

    // For cart SUBTOTAL amount INCLUDING TAXES (replace by this):
    // $passed = $cart->subtotal >= $targeted_cart_amount ? true : false ;

    // Iterating through each cart items
    foreach( $cart->get_cart() as $cart_item ){
        // The Product weight
        $product_weight = $cart_item['data']->get_weight();

        // cart item weight
        $cart_item_weight = $cart_item['quantity'] * $cart_item['data']->get_weight();

        // When cart amount is up to 250, Adding weight of heavy items
        if($passed && $product_weight > $targeted_weight)
            $calculated_weight += $cart_item_weight;
    }

    #### Making the fee calculation ####

    // Cart is up to 250 with heavy items
    if ( $passed && $calculated_weight != 0 ) {
        // Fee is based on cumulated weight of heavy items
        $fee = ( $calculated_weight * $price_per_kg ) - $flat_rate_price;
    }
    // Cart is below 250
    elseif ( ! $passed ) {
        // Fee is based on cart total weight
        $fee = ( $cart->get_cart_contents_weight( ) * $price_per_kg ) - $flat_rate_price;
    }

    #### APPLYING THE CALCULATED FEE ####

    // When cart is below 250 or when there is heavy items
    if ($fee > 0){
        // Rounding the fee
        $fee = round( $fee );
        // This shipping fee is taxable (You can have it not taxable changing last argument to false)
        $cart->add_fee( __('Shipping weight fee', 'woocommerce'), $fee, true);
    }
}

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 monto mínimo de ‘Tarifa plana’ se resta del cálculo de la tarifa, de esta manera el cliente pagar el precio correcto.

  • ¡Muchas gracias!

    – espiar

    22 de febrero de 2017 a las 17:41

  • ¿Es correcto cuando digo que esto está reemplazando la función del complemento Table Rate Shipping?

    – Solomax

    6 de marzo de 2019 a las 14:56

  • Me gustaría tener el mismo código, pero luego, cuando el peso supera los 10 kg, cobramos, cualquier cosa debajo es gratis. Y cuando el total del pedido es inferior a 20 USD cobramos 5 USD

    – Solomax

    6 de marzo de 2019 a las 15:14

  • @Solomax… Primer comentario: lo siento, no entiendo… Segundo comentario: primero debe intentar cambiar el código para obtener lo que desea… Si no funciona, haga una nueva pregunta vinculada a este hilo de respuesta, agregando su intento de código modificado con las explicaciones necesarias.

    – LoicTheAztec

    6 de marzo de 2019 a las 15:14


¿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