根据 WooCommerce 4.8+ 中的分类术语隐藏一些运费

问题描述

我用它来取消带有特定标签的产品的运输:

function specific_products_shipping_methods( $rates,$package ){
    // etiquette cocolis
    $terms = array( 'cocolis' );
    $taxonomy = 'product_tag';

    foreach( $package['contents'] as $cart_item ) {
        if ( has_term( $terms,$taxonomy,$cart_item['product_id'] ) )
        {
            unset( $rates['oik_weight_zone_shipping_49'] );
            unset( $rates['chrono10'] );
            unset( $rates['chrono13'] );
            add_filter('woocommerce_shipping_chosen_method','reset_default_shipping_method',10,2);
        }
    }
    return $rates;
}
add_filter( 'woocommerce_package_rates','specific_products_shipping_methods',2 );

function reset_default_shipping_method( $method,$available_methods ) {
    $default_method = 'per_product';
    if( array_key_exists($method,$available_methods ) )
        return $default_method;
    else
        return $method;
}

这工作正常,直到更新 woo 4.8.0 知道出了什么问题吗?

谢谢,

解决方法

您的代码中存在一些错误,请改用以下重新访问和优化的代码:

add_filter( 'woocommerce_package_rates','specific_products_shipping_methods',10,2 );
function specific_products_shipping_methods( $rates,$package ){

    $terms     = array('cocolis'); // Array of term slugs,names or ids
    $taxonomy  = 'product_tag'; // WooCommerce product tag taxonomy
    $rate_keys = array('oik_weight_zone_shipping_49','chrono10','chrono13'); // Shipping rates to be hidden
    $has_unset = false; // Initializing

    // Loop through cart items for the current shipping package
    foreach( $package['contents'] as $cart_item ) {
        // Targeting specific product tags
        if ( has_term( $terms,$taxonomy,$cart_item['product_id'] ) ) {
            // Loop through shipping rates to be removed (hidden)
            foreach( $rate_keys as $rate_key ) {
                if (isset($rates[$rate_key]) ) {
                    unset($rates[$rate_key]);
                    $has_unset = true; // Flag as unset to enable the filter below
                }
            }
        }
    }
    if ( $has_unset ) {
        add_filter('woocommerce_shipping_chosen_method','reset_default_shipping_method',3 );
    }
    return $rates;
}

function reset_default_shipping_method( $default,$rates,$chosen_method ) {
    $targeted_method = 'per_product'; // The shipping method rate to set as chosen one

    if( isset($rates[$targeted_method]) ) {
        $default = $targeted_method;
    }
    return $default;
}

代码位于活动子主题(或活动主题)的functions.php 文件中。在 WooCommerce 4.8+ 中测试并运行。

不要忘记清空您的购物车以刷新 WooCommerce 运输缓存

注意:对于 WooCommerce 类别,请将 $taxonomy 变量定义为 product_cat