WooCommerce运费根据购物车项目计算而定

时间:2017-08-22 10:02:45

标签: php wordpress woocommerce cart shipping

我想根据添加到购物车上的产品数量计算运费(

如果我购买一部手机,那么它会将运费计算为2.5,而在我购买的手机超过两两部后,运费将为5.0

 <?php

      $qty(1) * 2.5 = 2.5

      $qty(2) * 2.5 = 5.0

      $qty(3) * 2.5 = 5.0

  ?>

那么有什么想法或建议如何根据产品数量计算运费?

4 个答案:

答案 0 :(得分:2)

  

<强>更新

     

由于您的问题有点不清楚,您只需要在统一费率送货方式费用中添加 [qty]*2.5 (对于每个送货区域)在您的wooCommerce运输设置中。

     

但如果购物车中有2个不同的商品,则不会有效: item1 (qty 1) + item2 (qty 1)

所以这个答案会在所有情况下都这样做:

1)首先,您需要为每个运输区域设置&#34;统一费率&#34; 运费方式,费用将设置为 2.5 (在您的WooCommerce发货设置中)。

2)添加此代码,计算每个购物车项目(基于项目总数)新更新的运费:

add_filter( 'woocommerce_package_rates', 'custom_flat_rate_cost_calculation', 10, 2 );
function custom_flat_rate_cost_calculation( $rates, $package )
{
    // The cart count (total items in cart)
    $cart_count = WC()->cart->get_cart_contents_count();
    $taxes = array();

    // If there is more than 1 cart item
    if( $cart_count > 1 ){
        // Iterating through each shipping rate
        foreach($rates as $rate_key => $rate_values){
            // Targeting "Flat Rate" shipping method
            if ( 'flat_rate' === $rate_values->method_id ) {
                // Set the new calculated rate cost
                $rates[$rate_id]->cost = number_format($rates[$rate_id]->cost * $cumulated_active_quantity, 2);
                // Taxes rate cost (if enabled)
                foreach ($rates[$rate_id]->taxes as $key => $tax){
                    if( $rates[$rate_id]->taxes[$key] > 0 ){ // set the new tax cost
                        $taxes[$key] = number_format( $rates[$rate_id]->taxes[$key] * $cumulated_active_quantity, 2 );
                        $has_taxes = true;
                    } else {
                        $has_taxes = false;
                    }
                }
                if( $has_taxes )
                    $rates[$rate_id]->taxes = $taxes; 
            }
        }
    }
    return $rates;
}

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

此代码在WooCommerce 3+上测试并正常工作

  

您需要刷新送货区缓存:禁用固定费率,然后保存。并启用此费率并保存。

答案 1 :(得分:0)

您可以添加自定义费用:添加到主题functions.php或使用插件

add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge' );

function woocommerce_custom_surcharge() {
  global $woocommerce;

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $price_per_mobile = 2.5;
    $shipcharge = ( $woocommerce->cart->cart_contents_total * $price_per_mobile);   
    $woocommerce->cart->add_fee( 'Total Shipping Cost', $shipcharge, true, '' );

}

答案 2 :(得分:0)

继续使用Woocommerce过滤器woocommerce_package_rates。您可以在购物车页面中自定义所有运费。

以下是为国内和国际管道添加额外费用的代码

add_filter('woocommerce_package_rates', 'wf_modify_rate', 10, 3);
function wf_modify_rate( $available_shipping_methods, $package ){
    $origin_country = 'US';
    $amount_to_add_domestic = 10;
    $amount_to_add_inter_national = 20;

    $amount_to_add = ($package['destination']['country'] == $origin_country) ? 
    $amount_to_add_domestic : $amount_to_add_inter_national;

    $item_count = 0;
    foreach ($package['contents'] as $key => $item) {
        $item_count += $item['quantity'];
    }

    foreach ($available_shipping_methods as $methord_name => $methord) {
        $available_shipping_methods[$methord_name]->cost += ($amount_to_add*$item_count);
    }
    return $available_shipping_methods;
}

答案 3 :(得分:-1)

有一个带有缓存的woocommerce错误/功能。

https://github.com/woocommerce/woocommerce/issues/22100

@LoicTheAztec建议按管理员区域清除缓存。 但是,如果每次都需要通过切换方法或相应于时间等来计算成本,则此方法不起作用。

我的解决方案-使用woocommerce_package_rates过滤器

并添加用于调试传送模式的过滤器。

add_filter( 'pre_option_woocommerce_shipping_debug_mode', [ $this, 'pre_option_woocommerce_shipping_debug_mode' ] );
public function pre_option_woocommerce_shipping_debug_mode() {
        return 'yes';
    }

然后,您可以动态计算运费。