Woocommerce基于重量的自定义运费计算

时间:2019-03-07 08:05:25

标签: php wordpress woocommerce shipping fee

在Woocommerce中,我希望有一个功能可以包含在主题中,该功能可以根据价格和重量增加运费。

  1. 如果价格高于20USD,则免费送货,低于运费:3USD
  2. 如果重量超过10公斤,则需另付2美元的运费

基于Shipping calculated on the items weight and cart amount回答线程,我尝试了类似下面的代码:

String Q="SELECT a.id_spare_part, b.kode_asset, a.kode_spare_part, a.nama_spare_part, a.tgl_beli_spare, a.vendor,b.id_asset, b.garansi, a.harga_beli, a.serial, a.stok, a.consume, sum(a.stok-a.consume) as end_balance " +
  "FROM spare_part a, asset b " +
  "where a.id_asset=b.id_asset " +
  "group by a.id_spare_part";

编辑:

同时,我希望它立即将其显示在购物车页面上。现在它显示“输入地址以查看运送选​​项”。基本上,只需查看购物车的总数量,然后根据描述的重量和价格规则显示运费或免费送货即可。

enter address to view shipping options

2 个答案:

答案 0 :(得分:0)

woocommerce_package_rates是用于自定义运费的正确过滤器。

您可以通过以下方式实现。

第1步:创建两种送货方式,免费送货固定费用,海岸为3 $

步骤2:将以下代码段复制并粘贴到functions.php

在代码段中配置统一费率并免费送货。

add_filter( 'woocommerce_package_rates',  'modify_shipping_rate', 15, 2 );
function modify_shipping_rate( $available_shipping_methods, $package ){

    global $woocmmerce;
    $total_weight = WC()->cart->cart_contents_weight;
    $total_coast = WC()->cart->get_cart_contents_total();


    if( $total_coast >= 20 ){
        unset($available_shipping_methods['flat_rate:1']); //Remove flat rate for coat abobe 20$
    }elseif( $total_weight > 10 ){
        unset($available_shipping_methods['free_shipping:1']); // remove free shipping for below 20$ 
        $available_shipping_methods['flat_rate:1']->cost += 2; // add 2$ if weight exceeds 10KG
    }else{
        unset($available_shipping_methods['free_shipping:1']); // remove free shipping for below 20$ 
    }

    return $available_shipping_methods;
}

使用以下代码段更改默认购物车消息。

add_filter( 'woocommerce_cart_no_shipping_available_html', 'change_msg_no_available_shipping_methods', 10, 1  );
add_filter( 'woocommerce_no_shipping_available_html', 'change_msg_no_available_shipping_methods', 10, 1 );
function change_msg_no_available_shipping_methods( $default_msg ) {

    $custom_msg = "Enter address to view shipping options";
    if( empty( $custom_msg ) ) {
      return $default_msg;
    }

    return $custom_msg;
}

答案 1 :(得分:0)

以下代码不是基于自定义费用,而是基于运输方式的自定义。它需要为每个运输区域设置运输设置:

  • 已定义费用(为您提供$3的“固定费率”
  • 没有要求的“免费送货” (无限制)

该代码将根据权重以及税额计算来处理统一费率计算费用。

该代码将适用于任何运输区域,而无需在代码中定义运输方法ID。

代码如下:

add_filter( 'woocommerce_package_rates',  'filter_package_rates_callback', 10, 2 );
function filter_package_rates_callback( $rates, $package ) {

    ## -------- Settings -------- ##
    $targeted_total   = 20; // The targeted cart amount
    $weight_threshold = 10; // The cart weight threshold
    $extra_for_10kg   = 2;  // 10 Kg addition extra cost;

    $total_weight    = WC()->cart->get_cart_contents_weight();
    $cart_subtotal   = WC()->cart->get_subtotal(); // Excluding taxes

    // Set shipping costs based on weight
    foreach ( $rates as $rate_key => $rate ){
        $has_taxes = false;

        if( $cart_subtotal < $targeted_total || $total_weight >= $weight_threshold ){
            // Remove Free shipping Method
            if( 'free_shipping' === $rate->method_id ) {
                unset( $rates[$rate_key] );
            }
            // Flat rate calculation cost when 10 kg weight is reached
            if( 'flat_rate' === $rate->method_id && $total_weight >= $weight_threshold ) {
                // The default rate cost (set in the shipping method)
                $default_cost = $rate->cost; 

                // The new calculated cost (up to 10 kg)
                $new_cost = $default_cost + $extra_for_10kg; 

                // Tax rate conversion (for tax calculations)
                $tax_rate_converion = $new_cost / $default_cost;

                // Set the new cost
                $rates[$rate_key]->cost = $new_cost;

                // TAXES RATE COST (if enabled)
                foreach ($rates[$rate_key]->taxes as $key => $tax){
                    if( $tax > 0 ){
                        // New tax calculated cost
                        $taxes[$key] = $tax * $tax_rate_converion; 
                        $has_taxes = true;
                    }
                }
                // Set new taxes cost
                if( $has_taxes )
                    $rates[$rate_key]->taxes = $taxes;
            }
        } else {
            // Remove Flat Rate methods (keeping Free Shipping Method only)
            if( 'flat_rate' === $rate->method_id ) {
                unset( $rates[$rate_key] );
            }
        }
    }
    return $rates;
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。

  

刷新送货缓存: (必需)
  1)此代码已经保存在您的function.php文件中。
  2)在运输区域设置中,禁用/保存任何运输方式,然后启用返回/保存。
  您已完成,您可以对其进行测试。


直接显示运送方式 (关于您的问题编辑)

问题中提供的信息不足以了解如何进行管理。

如果您在一个国家/地区销售,并且您有一个唯一的送货地区,则可以使用以下方法强制未登录客户的国家/地区获取显示的送货方式:

add_action( 'template_redirect', 'allow_display_shipping_methods' );
function allow_display_shipping_methods() {
    // HERE define the targeted country code
    $country_code = 'GB';

    // Set the shipping country if it doesn't exist
    if( ! WC()->customer->get_shipping_country() )
        WC()->customer->set_shipping_country('GB');
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。

  

现在这是另一个问题,在您的第一个问题中,应该作为一个新问题提出。


相关答案: