根据 ACF 字段更改运费并排除某些运输方式

Change shipping cost depending on ACF field and exclude certain shipping methods

我正在尝试为所有不是从第三方运费计算的额外运费添加额外的运费 公司:

//add additional extra cost to shipping except for local pickup
    
        add_filter( 'woocommerce_package_rates', 'shipping_extra_cost' );
        function shipping_extra_cost( $rates ) {
        
            
            foreach($rates as $key => $rate ) {
                $rates[$key]->cost = $rates[$key]->cost + get_field('extra_cost', "51");
            }
    
        return $rates;
    }

但是本地运费还要加收额外费用 这是错误的。

我无法使用 WC shipping 类,因为这会干扰第三方运费计算程序。

有什么方法可以检查“本地取件”是否存在,然后从中排除额外费用?

您可以使用 $rate->method_id

排除 1 种或多种送货方式

注:因为get_field()只适用于使用ACF插件的时候我换成了固定的数字,根据自己的需要调整

所以你得到:

function filter_woocommerce_package_rates( $rates, $package ) {
    //$field = get_field( 'extra_cost', '51' );

    $field = 50;

    // Multiple can be added, separated by a comma
    $exclude = array( 'local_pickup' );

    // Loop through
    foreach ( $rates as $rate_key => $rate ) {
        // Targeting
        if ( ! in_array( $rate->method_id, $exclude ) ) {
            // Set the new cost
            $rates[$rate_key]->cost += $field;
        }
    }

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

出于调试目的您可以暂时使用:

function filter_woocommerce_cart_shipping_method_full_label( $label, $method ) {
    // Getters
    $id = $method->id;
    $method_id = $method->method_id;

    // Output
    $label .= '<span style="color:red; font-size:20px; display:block;">Id = ' . $id . '</span>';
    $label .= '<span style="color:red; font-size:20px; display:block;">Method id = ' . $method_id . '</span>';

    return $label; 
}
add_filter( 'woocommerce_cart_shipping_method_full_label', 'filter_woocommerce_cart_shipping_method_full_label', 10, 2 );

结果: