简体   繁体   中英

Multiply shipping cost in WooCommerce

I've tried to multiply shipping cost depending on how many pallets are in order. I think filter is wrong or something. It just doesnt change shipping price.

$calc = ceil($a+$b / 8); $a > is quantity of pallets, $b > is quantity of units what calculates how many pallets.

My code (function.php):

add_filter( 'woocommerce_cart_shipping_total', 'woocommerce_cart_shipping_total_filter_callback', 11, 2 );
function woocommerce_cart_shipping_total_filter_callback( $total, $cart )
{
     if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( 0 < $cart->get_shipping_total() ) {
        if ( $cart->display_prices_including_tax() ) {
            $a = 0;
            $b = 0;
            foreach( WC()->cart->get_cart() as $cart_item ){
                if (!empty(get_post_meta($cart_item['variation_id'], '_number_field', true))) {
                    $a += $cart_item['quantity'];
                } else {
                    $atk = strstr(get_post_meta($cart_item['variation_id'], '_alus_al', true), 'tk', true);
                    
                    $b += ceil($cart_item['quantity'] / $atk);
                }
            }
            $calc = ceil($a+$b / 8); // 8 pallets maximum
            $total = wc_price( ( $cart->shipping_total + $cart->shipping_tax_total ) * $calc );
            if ( $cart->shipping_tax_total > 0 && ! wc_prices_include_tax() ) {
                $total .= ' <small class="tax_label">' . WC()->countries->inc_tax_or_vat() . '</small>';
            }
        } else {
            $a = 0;
            $b = 0;
            foreach( WC()->cart->get_cart() as $cart_item ){
                if (!empty(get_post_meta($cart_item['variation_id'], '_number_field', true))) {
                    $a += $cart_item['quantity'];
                } else {
                    $atk = strstr(get_post_meta($cart_item['variation_id'], '_alus_al', true), 'tk', true);
                    
                    $b += ceil($cart_item['quantity'] / $atk);
                }
            }
            $calc = ceil($a+$b / 8); // 8 pallets maximum
            $total = wc_price( $cart->shipping_total * $calc );
            if ( $cart->shipping_tax_total > 0 && wc_prices_include_tax() ) {
                $total .= ' <small class="tax_label">' . WC()->countries->ex_tax_or_vat()  . '</small>';
            }
        }
    }
    return  $total;
}

My problem is that it doesnt change shipping cost. So I excpect it doesnt work.

Like user @LoicTheAztec mentioned I should use woocommerce_package_rates to override custom prices for shipping plugin.

add_filter( 'woocommerce_package_rates', 'custom_shipping_costs', 20, 2 );
function custom_shipping_costs( $rates, $package ) {
    $a = 0;
    $b = 0;
    foreach( WC()->cart->get_cart() as $cart_item ){
        if (!empty(get_post_meta($cart_item['variation_id'], '_number_field', true))) {
            $a += $cart_item['quantity'];
        } else {
            $atk = strstr(get_post_meta($cart_item['variation_id'], '_alus_al', true), 'tk', true);
            $atb = $atk / 2;
            if ($cart_item['quantity'] < $atb) {
                $b += 0;
            } else {
                $b += ceil($cart_item['quantity'] / $atk);
            }
        }
    }
    $tt = $a+$b;
    $calc = ceil($tt / 8);

    foreach( $rates as $rate_key => $rate ){
        // Excluding free shipping methods
        if( $rate->method_id != 'free_shipping'){
            // Set rate cost
            $rates[$rate_key]->cost = $rates[$rate_key]->cost * $calc;

            // Set taxes rate cost (if enabled)
            $taxes = array();
            foreach ($rates[$rate_key]->taxes as $key => $tax){
                if( $rates[$rate_key]->taxes[$key] > 0 )
                    $taxes[$key] = $new_cost * $tax_rate;
            }
            $rates[$rate_key]->taxes = $taxes;

        }
    }
    return $rates;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM