php - 当仅在 Woocommerce 中的一个区域提供免费送货时,隐藏其他送货选项
问题描述
我需要一种方法来实现以下目标:如果可以免费送货,并且订单正在运送到特定区域,则隐藏所有其他运送方式。
我发现了这个片段:
function hide_shipping_when_free_is_available( $rates ) {
$free = array();
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id ) {
$free[ $rate_id ] = $rate;
break;
}
}
return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 100 );
我如何在其中添加条件以仅将其应用于前往一个区域的订单?
解决方案
当特定区域可免费送货时,以下代码将隐藏所有其他送货方式(您将在函数中定义目标区域 ID 或区域名称):
add_filter( 'woocommerce_package_rates', 'free_shipping_hide_others_by_zone', 100, 2 );
function free_shipping_hide_others_by_zone( $rates, $package ) {
// HERE define your shipping zone ID OR the shipping zone name
$defined_zone_id = '';
$defined_zone_name = 'Europe';
// Get The current WC_Shipping_Zone Object
$zone = WC_Shipping_Zones::get_zone_matching_package( $package );
$zone_id = $zone->get_id(); // The zone ID
$zone_name = $zone->get_zone_name(); // The zone name
$free = array(); // Initializing
// Loop through shipping rates
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id && ( $zone_id == $defined_zone_id || $zone_name == $defined_zone_name ) ) {
$free[ $rate_id ] = $rate;
break;
}
}
return ! empty( $free ) ? $free : $rates;
}
代码位于活动子主题(或活动主题)的 function.php 文件中。测试和工作。
推荐阅读
- angular - instanceof 在 Angular 库中创建时返回 false
- javascript - 如何修复错误:迁移的 MD5 校验和失败 [1] npm ERR!代码 ELIFECYCLE npm 错误!错误号 1
- python - 如何用python子进程调用用shell编写的jq?
- git - 你如何在 azure devops repo 上创建一个 git 页面?
- ruby-on-rails - 在 Rails 中进行视图更新的正确方法
- pandas - 将 href 链接附加到数据框列表中,获取所有必需的信息,但仅显示最后一页的链接
- jersey - Jersey 1.x - 将 Swagger 1.x 提升到 2.x
- r - 将日期列表转换为序列
- c# - .NET CORE_Blazor 找不到 Http.SendAsJsonAsync()
- kubernetes - 将文件注入 Helm 模板