当 WooCommerce 中提供免费送货时,仅禁用特定的固定费率送货方式

Disable only specific flat rate shipping method when free shipping is available in WooCommerce

我的 WooCommerce 网站上有两种固定费率,我想在启用免费送货后禁用其中一种。我有一个功能仅适用于所有统一费率。

如何检查运费的实例 ID?谁能帮助我了解如何检查实例 ID?

我试图回显运输数据以了解可用的值,但前端也没有显示回显,所以提示为什么会很好。

这是我的代码尝试:

function hide_shipping_when_free_is_available( $rates, $package ) {
    $new_rates = array();

    foreach ( $rates as $rate_id => $rate ) {
        // Only modify rates if free_shipping is present.
        if ( 'free_shipping' === $rate->method_id ) {
            $new_rates[ $rate_id ] = $rate;
            break;
        }
    }

    if ( ! empty( $new_rates ) ) {
        //Save local pickup if it's present.
        foreach ( $rates as $rate_id => $rate ) {
            if ('local_pickup' === $rate->method_id ) {
                $new_rates[ $rate_id ] = $rate;
            }
            if ( 'flat_rate:20' === $rate->instance_id )
                $new_rates[ $rate_id ] = $rate; 
            }
        return $new_rates;
    }

    return $rates;
}
add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );

如果您检查购物车或结账时的送货方式单选按钮,您会看到如下内容:

<input type="radio" name="shipping_method[0]" data-index="0" id="shipping_method_0_flat_rate20" value="flat_rate:20" class="shipping_method" checked="checked">

所以在 value="flat_rate:20" (这是速率 ID):

  • 方法 Idflat_rate,
  • 实例ID20.

注意:代码真的可以简化...

但由于您不提供免费送货和其他固定费率 费率 ID (或实例 ID),我保留您的代码对其进行一些更改,这样:

function hide_shipping_when_free_is_available( $rates, $package ) {
    $new_rates = array();

    foreach ( $rates as $rate_id => $rate ) {
        // Only modify rates if free_shipping is present.
        if ( 'free_shipping' === $rate->method_id ) {
            $new_rates[ $rate_id ] = $rate;
            break;
        }
    }

    if ( ! empty( $new_rates ) ) {
        foreach ( $rates as $rate_id => $rate ) {
            //Save local pickup if it's present.
            if ('local_pickup' === $rate->method_id ) {
                $new_rates[ $rate_id ] = $rate;
            }
            if ( 20 == $rate->instance_id )
                $new_rates[ $rate_id ] = $rate;
            }
        }
        return $new_rates;
    }
    return $rates;
}
add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );

应该可以。

您可以根据其id查看是否可以免费送货。如果可用,它会删除运费 flat_rate:20

Replace free_shipping:2 with your free shipping id.

// if free shipping is available, disable a specific shipping rate
add_filter( 'woocommerce_package_rates', 'hide_specific_shipping_rate_if_shipping_free_is_available', 10, 2 );
function hide_specific_shipping_rate_if_shipping_free_is_available( $rates, $package ) {
    if ( isset( $rates['free_shipping:2'] ) ) {
        unset( $rates['flat_rate:20'] );
    }
    return $rates;
}

代码已经过测试并且可以工作。将其添加到您的活动主题 functions.php.