在Woocommerce 3中定制免费送货计算费率

时间:2018-04-09 22:27:04

标签: php wordpress woocommerce checkout shipping

我在结帐时应用此过滤器时遇到问题。下面的代码在购物车页面上按预期工作,如果满足指定的条件(在这种情况下为#34; free_shipping"),则每个发货方法的标签都会更新。

add_filter( 'woocommerce_package_rates', 'my_custom_shipping', 100, 2 );

function my_custom_shipping( $rates, $package ) {

    $percentage = 0.01;

    foreach($rates as $key => $rate ) {

        $test_method_id = $rates[$key]->method_id;
        if ( $test_method_id === "free_shipping" ){
            $surcharge = ( wc()->cart->cart_contents_total + $rates[$key]->cost ) * $percentage;
            $rates[$key]->label .= " Fee: {$surcharge}";
            $rates[$key]->cost += $surcharge;
        }
    }



    return $rates;

}// Function END

虽然这在购物车页面上工作正常(但只有在调试模式处于活动状态时,没有任何内容在调试模式关闭时加载,这非常令人沮丧),在结帐页面上更改会暂时加载(我可以向下滚动并查看它们)但它们很快被原始标签覆盖。我似乎无法弄清楚为什么,我认为设置过滤器以后调用可能会有所帮助,但它似乎没有。

所有数据都在那里,我可以输出并查看它,但它只是在结帐时不会永久适用,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

您无法获得"免费送货的初始费用"价格,因为没有任何成本领域"免费送货"后端的方法。

但您可以添加计算成本并更改标签(以不同方式):

add_filter( 'woocommerce_package_rates', 'custom_shipping_rates', 100, 2 );
function custom_shipping_rates( $rates, $package ) {
    $cc_total = WC()->cart->cart_contents_total;
    $percentage = 0.01; // 1%

    foreach( $rates as $rate_key => $rate ) {
        if ( 'free_shipping' === $rate->method_id ){

            // Calculation
            $surcharge = $cc_total * $percentage;

            // Set the new Label name
            $rates[$rate_key]->label .= ' ' . __("Fee", "woocommerce");

            // Set Custom rate cost
            $rates[$rate_key]->cost = round($surcharge, 2);
        }
    }
    return $rates;
}

代码放在活动子主题(或活动主题)的function.php文件中。经过测试和工作

enter image description here

  

您需要刷新送货缓存:
  1)首先,此代码已保存在function.php文件中。
  2)在运输设置中,输入运输区域并禁用运输方式和"保存"。然后重新启用送货方式和"保存"。 你已经完成了。

更新: (强制清除WC_Session中的送货方式)

add_filter( 'woocommerce_package_rates', 'custom_shipping_rates', 100, 2 );
function custom_shipping_rates( $rates, $package ) {
    // Reset session
    WC()->session->set('shipping_for_package_0', array('package_hash' => ''));

    $cc_total = WC()->cart->cart_contents_total;
    $percentage = 0.01; // 1%

    foreach( $rates as $rate_key => $rate ) {
        if ( 'free_shipping' === $rate->method_id ){

            // Calculation
            $surcharge = $cc_total * $percentage;

            // Set the new Label name
            $rates[$rate_key]->label .= ' ' . __("Fee", "woocommerce");

            // Set Custom rate cost
            $rates[$rate_key]->cost = round($surcharge, 2);
        }
    }

    return $rates;
}

代码放在活动子主题(或活动主题)的function.php文件中。它可以工作......