title: "免费配送自定义设置" post_status: publish comment_status: open taxonomy: category: - woocommerce post_tag: - Code Snippets - Repos - Data
免费配送自定义设置
免费配送:高级设置/自定义
概述
默认情况下,WooCommerce 会显示所有与客户和购物车内容匹配的配送方式。这意味着免费配送也会与统一费率和其他配送方式一起显示。
要隐藏所有其他配送方式,只显示免费配送,需要使用自定义 PHP 代码或插件/扩展。
添加代码
在添加代码片段之前,请清除您的 WooCommerce 缓存。转到 WooCommerce > 系统状态 > 工具 > WooCommerce 瞬态 > 清除瞬态。
代码片段
如何只显示免费配送?
以下代码片段将在免费配送可用时隐藏所有其他配送方式。
/**
* 当免费配送可用时,隐藏其他配送费率。
*
* @param array $rates 找到的费率数组。
*
* @return array
*/
function fsc_hide_shipping_rates_when_free_is_available( $rates ) {
// 遍历找到的每个费率。
foreach ( $rates as $rate_id => $rate ) {
// 如果找到免费配送,将其定义为唯一的费率,并退出 foreach 循环。
if ( 'free_shipping' === $rate->method_id ) {
$rates = [ $rate_id => $rate ];
break;
}
}
return $rates;
}
add_filter( 'woocommerce_package_rates', 'fsc_hide_shipping_rates_when_free_is_available', 10, 1 );
如何只显示本地自提和免费配送?
以下代码片段将在免费配送可用时隐藏所有其他配送方式,但如果本地自提可用,则会显示本地自提。
/**
* 如果免费配送可用,则隐藏其他费率,排除本地自提。
*
* @param array $rates 找到的费率数组。
*
* @return array
*/
function fsc_hide_shipping_rates_when_free_is_available_excluding_local( $rates ) {
// 定义数组,用于存储免费配送和本地自提方法,如果找到。
$free_shipping = [];
$local_pickup = [];
// 遍历接收到的每个费率。
foreach ( $rates as $rate_id => $rate ) {
// 如果找到任何一种方法,将其添加到其各自的数组中。
if ( 'free_shipping' === $rate->method_id ) {
$free_shipping[ $rate_id ] = $rate;
continue;
}
if ( 'pickup_location' === $rate->method_id ) {
$local_pickup[ $rate_id ] = $rate;
}
}
// 如果 free_shipping 数组包含一种方法,则将 local_pickup 合并到其中,并覆盖 rates 数组。
if ( ! empty( $free_shipping ) ) {
$rates = array_merge( $free_shipping, $local_pickup );
}
return $rates;
}
add_filter( 'woocommerce_package_rates', 'fsc_hide_shipping_rates_when_free_is_available_excluding_local', 10, 1 );
通过钩子启用或禁用免费配送
如果您想通过编程方式了解是否可用免费配送,这是可能的。WooCommerce 提供了类似于以下的代码过滤器:
return apply_filters( 'woocommerce_shipping_' . $this->id . '_is_available', $is_available );
这意味着您可以使用 add_filter() 函数,目标是 woocommerce_shipping_free_shipping_is_available,并接收 true 或 false,以确定是否已启用免费配送。例如,以下代码片段将记录免费配送是否可用:
/**
* 记录免费配送是否可用。
*
* @param bool $is_available 如果免费配送可用,则为 `true`,否则为 `false`。
*
* @return bool
*/
function fsc_free_shipping_is_available( $is_available ) {
if ( $is_available ) {
error_log( '免费配送可用' );
} else {
error_log( '免费配送不可用' );
}
return $is_available;
}
add_filter( 'woocommerce_shipping_free_shipping_is_available', 'fsc_free_shipping_is_available', 10, 1 );
需要在每个分类/产品基础上启用配送方法,分割订单,或其他场景?
需要更多灵活性?请查看我们的 高级配送方法扩展。