php-根据购物车物品重量和购物车数量计算的运费

在客户WooCommerce网站上,订单额达250的订单启用了免费送货方式.我使用下面的代码(从this answer开始),以在订单额超过250时隐藏其他运费,除非购物车中有重物.

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;
}

但现在,我想设置一个可变的运费,该运费将通过两种方式计算:

>当订单金额低于250时,将按订单商品总重量的每公斤1欧元计算.
>当订单金额不超过250时,将仅对重量较重的商品(每公斤1欧元)进行计算.如果没有重物,则可以享受免费送货费用.

有点复杂,我该如何实现?
有追踪的路线吗?

我已经尝试了一些现有的相关插件,但是在这种情况下它们并不方便.

谢谢.

解决方法:

代码已改进(2019年3月):

是的,如果没有带有自定义运费的插件(按购物车重量和购物车数量计算),这是可能的.但是,您需要将“统一费率”的送货方式设置为最少.这通常应该与您正在使用的代码一起使用.

这是该代码(注释):

//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);
    }
}

代码在您的活动子主题(或主题)的function.php文件中,或者在任何插件文件中.

此代码已经过测试,可以正常工作

The minimal ‘Flat rate’ amount is subtracted from the fee calculation, this way the customer pay the right price.

上一篇:php – 如何读取webhooks发送的数据?


下一篇:php – 在Woocommerce Storefront主页上自定义显示的产品