我在结帐时应用此过滤器时遇到问题。下面的代码在购物车页面上按预期工作,如果满足指定的条件(在这种情况下为#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
虽然这在购物车页面上工作正常(但只有在调试模式处于活动状态时,没有任何内容在调试模式关闭时加载,这非常令人沮丧),在结帐页面上更改会暂时加载(我可以向下滚动并查看它们)但它们很快被原始标签覆盖。我似乎无法弄清楚为什么,我认为设置过滤器以后调用可能会有所帮助,但它似乎没有。
所有数据都在那里,我可以输出并查看它,但它只是在结帐时不会永久适用,为什么会发生这种情况?
答案 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文件中。经过测试和工作
您需要刷新送货缓存:
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文件中。它可以工作......