在 Woocommerce 中保持最高统一运费和本地取货
Keep highest flat rate shipping cost and local pickup in Woocommerce
我试图在购物车中显示最高的运费。我为此找到了一个不错的小片段:
function only_show_most_expensive_shipping_rate( $rates, $package ) {
$most_expensive_method = '';
$new_rates = array();
// Loop through shipping rates
if ( is_array( $rates ) ) {
foreach ( $rates as $key => $rate ) {
// Set variables when the rate is more expensive than the one saved
if ( empty( $most_expensive_method ) || $rate->cost > $most_expensive_method->cost ){
$most_expensive_method = $rate;
}
}
}
// Return the most expensive rate when possible
if ( ! empty( $most_expensive_method ) ){
/**
** Keep local pickup if it's present.
**/
foreach ( $rates as $rate_id => $rate ) {
if ('local_pickup' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}
return array( $most_expensive_method->id => $most_expensive_method );
}
return $rates;
}
add_action('woocommerce_package_rates', 'only_show_most_expensive_shipping_rate', 10, 2);
然而,此代码段还隐藏了 "local pickup" 送货方式。
为什么上面的方法不行?现在它只显示最高运费 class/price 并隐藏所有其他的,包括取货方式。
是不是因为两个数组?我没有看到任何错误弹出。
非常感谢任何帮助!
以下将保持最高运费统一费率和本地取货送货方式:
add_action('woocommerce_package_rates', 'keep_highest_flat_rate_cost', 10, 2);
function keep_highest_flat_rate_cost( $rates, $package ) {
$flat_rate_costs = [];
// Loop through shipping methods rates
foreach ( $rates as $key_rate => $rate ) {
// Targeting only "Flat rate" type shipping methods
if ( ! in_array( $rate->method_id, ['local_pickup', 'free_shipping'] ) ) {
// Store the Rate ID keys with corresponding costs in an indexed array
$flat_rate_costs[$key_rate] = $rate->cost;
}
}
// Sorting "Flat rate" costs in DESC order
arsort($flat_rate_costs);
// Remove the highest cost from the array
array_shift($flat_rate_costs);
// Loop through remaining "Flat rate" shipping methods to remove them all
foreach ( $flat_rate_costs as $key_rate => $cost){
unset($rates[$key_rate]);
}
return $rates;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。
You should need to refresh the shipping caches:
1) First ensure that the code is already saved on your function.php file.
2) In Shipping settings, enter in a Shipping Zone: Disable any Shipping Method and "save", then re-enable it and "save". You are done.
我试图在购物车中显示最高的运费。我为此找到了一个不错的小片段:
function only_show_most_expensive_shipping_rate( $rates, $package ) {
$most_expensive_method = '';
$new_rates = array();
// Loop through shipping rates
if ( is_array( $rates ) ) {
foreach ( $rates as $key => $rate ) {
// Set variables when the rate is more expensive than the one saved
if ( empty( $most_expensive_method ) || $rate->cost > $most_expensive_method->cost ){
$most_expensive_method = $rate;
}
}
}
// Return the most expensive rate when possible
if ( ! empty( $most_expensive_method ) ){
/**
** Keep local pickup if it's present.
**/
foreach ( $rates as $rate_id => $rate ) {
if ('local_pickup' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}
return array( $most_expensive_method->id => $most_expensive_method );
}
return $rates;
}
add_action('woocommerce_package_rates', 'only_show_most_expensive_shipping_rate', 10, 2);
然而,此代码段还隐藏了 "local pickup" 送货方式。
为什么上面的方法不行?现在它只显示最高运费 class/price 并隐藏所有其他的,包括取货方式。
是不是因为两个数组?我没有看到任何错误弹出。
非常感谢任何帮助!
以下将保持最高运费统一费率和本地取货送货方式:
add_action('woocommerce_package_rates', 'keep_highest_flat_rate_cost', 10, 2);
function keep_highest_flat_rate_cost( $rates, $package ) {
$flat_rate_costs = [];
// Loop through shipping methods rates
foreach ( $rates as $key_rate => $rate ) {
// Targeting only "Flat rate" type shipping methods
if ( ! in_array( $rate->method_id, ['local_pickup', 'free_shipping'] ) ) {
// Store the Rate ID keys with corresponding costs in an indexed array
$flat_rate_costs[$key_rate] = $rate->cost;
}
}
// Sorting "Flat rate" costs in DESC order
arsort($flat_rate_costs);
// Remove the highest cost from the array
array_shift($flat_rate_costs);
// Loop through remaining "Flat rate" shipping methods to remove them all
foreach ( $flat_rate_costs as $key_rate => $cost){
unset($rates[$key_rate]);
}
return $rates;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。
You should need to refresh the shipping caches:
1) First ensure that the code is already saved on your function.php file.
2) In Shipping settings, enter in a Shipping Zone: Disable any Shipping Method and "save", then re-enable it and "save". You are done.