在 WooCommerce 2.6 和 3+ 中删除特定类别的统一运费方法

Posted

技术标签:

【中文标题】在 WooCommerce 2.6 和 3+ 中删除特定类别的统一运费方法【英文标题】:Remove shipping Flat Rate method for particular Category in WooCommerce 2.6 and 3+ 【发布时间】:2016-12-19 12:55:49 【问题描述】:

我在 woocommerce 送货选项方面需要帮助,我想隐藏特定产品类别的统一费率,我只想显示本地送货或本地取货选项。

对于所有其他类别,所有选项都应该有效。

我已经尝试使用该代码(添加到我的主题的 function.php 文件中):

function cart_has_product_with_orange_cats() 

    global $woocommerce;
    $product_in_cart = false;

    // start of the loop that fetches the cart items
    foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) 
        $_product = $values['data'];
        $terms = get_the_terms( $_product->id, 'product_cat' );
        // second level loop search, in case some items have several categories

        if($terms)

            foreach ($terms as $term) 
                $_categoryid = $term->term_id;

                if ( $_categoryid == 16 ) 
                    //category is in cart!
                    $product_in_cart = true;
                
               
        
    
    return $product_in_cart;


// add filter and function to hide method

add_filter( 'woocommerce_available_shipping_methods', 'custom_shipping_methods' , 10, 1 );

function custom_shipping_methods( $available_methods )

    if ( cart_has_product_with_orange_cats() ) 

        foreach($available_methods as $key => $method)
            if( $key == 'local_delivery' || $key == 'local_pickup')
                continue;
            
            unset($available_methods[$key]);

        
        // remove the rate you want
    
    // return the available methods without the one you unset.
    return $available_methods;

但这对我不起作用,可能是因为最新版 WooCommerce 的代码过时或任何其他问题。

我怎样才能做到这一点?

谢谢。

【问题讨论】:

【参考方案1】:

更新 (与 WC 3+ 兼容,也适用于可变产品)

此答案的功能齐全的测试更正的代码位于另一个线程上:Shipping methods - Local Pickup option not available when Flat Rate is hidden


重要提示: woocommerce_available_shipping_methods hook 自 WC 2.1+ 版起已弃用,您需要改用 woocommerce_package_rates 过滤钩。

WooCommerce 2.6+ 版引入了新的送货区域。因此,所有与运费相关的 WooCommerce 先前版本的代码都过时并且将不再工作

详情: global $woocommerce;** 与 $woocommerce->cart 已替换为 WC()->cart。 您将改用 WC()->cart->get_cart()...

我们不再需要您的自定义条件函数,因为 WordPress 中已经存在一个条件函数,您可以将其定位为 WooCommerce 产品类别。此函数接受术语 ID、术语 slug 或术语名称:

has_term( 'your_category', 'product_cat', $post_id )

所以我们可以在这段代码中使用has_term()条件函数:

add_filter( 'woocommerce_package_rates', 'conditional_hide_shipping_methods', 100, 2 );    
function conditional_hide_shipping_methods( $rates, $package )

    // Define/replace here your correct category slug (!)
    $product_category = 'your_category';
    $prod_cat = false;

    // Going through each item in cart to see if there is anyone of your category        
    foreach ( WC()->cart->get_cart() as $cart_item ) 
        $product_id = $cart_item['product_id'];
        if ( has_term( $product_category, 'product_cat', $product_id ) )
            $prod_cat = true;
        
    

    $rates_arr = array();

    if ( $prod_cat ) 
        foreach($rates as $key => $rate) 
            if ('free_shipping' === $rate->method_id || 'local_pickup' === $rate->method_id || 'local_delivery' === $rate->method_id) 
                $rates_arr[ $rate_id ] = $rate;
                break;
            
        
    
    return !empty( $rates_arr ) ? $rates_arr : $rates;

在添加 sn-p 之前,请确保清除您的 WooCommerce 缓存(WooCommerce > 系统状态 > 工具 > WC 瞬态 > 清除瞬态),因为会缓存运输方式。

此代码在您的活动子主题或主题的 function.php 文件中。

如果您的set your shipping zones… 正确,此代码应该可以工作


参考资料:

Hide other shipping methods when FREE SHIPPING is available WooCommerce - Hide other shipping methods when FREE SHIPPING is available WooCommerce 2.6 - Hiding paid shipping when free shipping is triggered by reaching specific amount WooCommerce Cart - Conditional Items categories validation How to Setup Shipping Zones in WooCommerce 2.6

【讨论】:

您好,感谢您的出色回答,它可以正常工作,但只有一个问题,本地取货选项现在不可用。它仅显示本地交付。我也想展示本地取货。谢谢。 @LoicTheAztec 这是一个了不起的解决方案!工作完美!一个问题 - 当添加来自不同类别的产品时,有没有办法再次显示全套运输选项?我们有一个带有智能优惠券的礼品卡产品,如果它是购物车中唯一的商品,则不需要运输,但如果他们添加了其他产品,则运输方式将再次适用。 @Nalakira 是的,这是可能的......但它会改变这个代码......你可以问一个新问题,在你的问题中添加你现在得到的自定义代码。 @LoicTheAztec 这是新问题,如果您想尝试一下! ***.com/questions/50475753/…

以上是关于在 WooCommerce 2.6 和 3+ 中删除特定类别的统一运费方法的主要内容,如果未能解决你的问题,请参考以下文章

1144: 零起点学算法51——数组中删数

1145: 零起点学算法52——数组中删数II (有问题!)

完了,良许直播中删库了……

在 Woocommerce 3 中获取地理位置的国家和地区

问题解决:MySQL 从复合主键中删几个键

零起点学算法83——数组中删数