1
votes

In Woocommerce I have added an additional shipping cost to the cart using the fee API.

My code is:

add_action( 'woocommerce_cart_calculate_fees', 'pt_add_handling_fee' );
function pt_add_handling_fee() {

    $title = 'Maggiorazione Isole & Calabria';

    global $woocommerce;
    $peso_totale = $woocommerce->cart->cart_contents_weight;
    $provincia = $woocommerce->customer->get_shipping_state();
    // echo 'weight'.$woocommerce->cart->cart_contents_weight;
    // echo 'price'.$woocommerce->cart->subtotal;

    // Maggiorazione 5€ ogni 100kg per la Sardegna
    if ($peso_totale > 99 && ($provincia == "CA" or $provincia == "NU")) {
        $fee = $peso_totale / 100 * 5;
    }
    // Maggiorazione 3€ ogni 100kg per la Sicilia
    if ($peso_totale > 99 && ($provincia == "AG" or $provincia == "CL")) {
        $fee = $peso_totale / 100 * 3;
    }
    // Maggiorazione 2€ ogni 100kg per la Calabria
    if ($peso_totale > 99 && ($provincia == "CZ" or $provincia == "CS")) {
        $fee = $peso_totale / 100 * 2;
    }

     $woocommerce->cart->add_fee( $title, $fee, TRUE, 'standard' );
}

So I apply a surcharge for some provinces, if the total weight is greater than 99 kg.

But the problem is that for other provinces, the fee is still applied with a value of "0 €".

How to make this fee applied only for the defined provinces, when the total cart weight is over 99 Kg?

It's possible? Any help is appreciated.

1
This is not clear and this simple line of code is not enough… so please give use your entire hooked function, explaining better what is that value? Nobody can guess what is in your mind.LoicTheAztec

1 Answers

1
votes

Your code is a bit outdated and woocommerce_cart_calculate_fees action hook has the WC_Cart object as available argument.

global $woocommerce with $woocommerce->cart or $woocommerce->customer are now simply replaced by:

  • WC()->cart (the instance of the WC_Cart object)
  • WC()->customer (the instance of the WC_Customer object)

To make the fee applied only for your specific conditions, try this revisited code:

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

    $targeted_weight = 100; // Define the starting targeted weight
    $cart_weight     = $cart->get_cart_contents_weight();
    $shipping_state  = WC()->customer->get_shipping_state();
    $percent         = 0; // Initializing

    if ( $cart_weight >= $targeted_weight ) {
        // 5 € of surcharge per 100kg for Sardinia
        if ( in_array( $shipping_state, array('CA', 'NU') ) ) {
            $percent = 5;
        }
        // 3 € of surcharge per 100kg for Sicily
        elseif ( in_array( $shipping_state, array('AG', 'CL') ) ) {
            $percent = 3;
        }
        // 2 € of surcharge per 100kg for Calabria
        elseif ( in_array( $shipping_state, array('CZ', 'CS') ) ) {
            $percent = 2;
        }
    }

    if( $percent > 0 ){
        // Fee calculation
        $fee = $cart_weight * $percent / 100;

        // Add calculated fee (Taxable for "standart" default tax class)
        $cart->add_fee( __("Maggiorazione Isole & Calabria", "woocommerce"), $fee, true );
    }
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.