当 WooCommerce 中存在免费送货选项时,仅禁用特定的统一运费送货方式

3

我的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 );
2个回答

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 );

它应该可以工作。


完美!非常感谢您的快速回答!感激不尽 :) - Naomi S

2

根据其ID,您可以检查是否可用免费送货。 如果可用,则会删除运费率 flat_rate:20

free_shipping:2 替换为您的免费送货 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文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接