WooCommerce 文档

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,并接收 truefalse,以确定是否已启用免费配送。例如,以下代码片段将记录免费配送是否可用:

/**
 * 记录免费配送是否可用。
 *
 * @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 );

需要在每个分类/产品基础上启用配送方法,分割订单,或其他场景?

需要更多灵活性?请查看我们的 高级配送方法扩展