【问题标题】:Hide shipping methods based on products categories in Woocommerce根据 Woocommerce 中的产品类别隐藏运输方式
【发布时间】:2020-08-25 13:49:05
【问题描述】:

使用 Woocommerce,当定义的产品类别在购物车中时,我想隐藏除“本地取货”以外的所有运输方式……

以下代码对其他产品类型执行此操作,可变产品除外:

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

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

    // Going through each item in cart to see if there is anyone of your category
    foreach ( WC()->cart->get_cart() as $values ) {
        $product = $values['data'];

        // compatibility with WC +3
        $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;

        if ( has_term( $cat_slug, 'product_cat', $product_id ) )
            $prod_cat = true;
    }

    $rates_arr = array();

    if ( $prod_cat ) {
        foreach($rates as $rate_id => $rate) { // <== There was a mistake here
            if ('local_pickup' === $rate->method_id) {
                $rates_arr[ $rate_id ] = $rate;
            }
        }
    }
    return !empty( $rates_arr ) ? $rates_arr : $rates;
}

我该怎么做才能使它也适用于可变产品?任何帮助表示赞赏。

【问题讨论】:

    标签: php wordpress woocommerce custom-taxonomy shipping-method


    【解决方案1】:

    我已经重新访问了您的代码,这是使它也适用于可变产品的正确方法:

    add_filter( 'woocommerce_package_rates', 'product_category_hide_shipping_methods', 90, 2 );
    function product_category_hide_shipping_methods( $rates, $package ){
    
        // HERE set your product categories in the array (IDs, slugs or names)
        $categories = array( 'clothing');
        $found = false;
    
        // Loop through each cart item Checking for the defined product categories
        foreach( $package['contents'] as $cart_item ) {
            if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ){
                $found = true;
                break;
            }
        }
    
        $rates_arr = array();
        if ( $found ) {
            foreach($rates as $rate_id => $rate) { 
                if ('local_pickup' === $rate->method_id) {
                    $rates_arr[ $rate_id ] = $rate;
                }
            }
        }
        return !empty( $rates_arr ) ? $rates_arr : $rates;
    }
    

    代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且可以工作。

    您应该需要刷新运输缓存:
    1) 首先,此代码已保存在您的 function.php 文件中。
    2) 在配送设置中,输入配送区域并禁用配送方式并“保存”。然后重新启用运送方式并“保存”。 你已经完成了。

    【讨论】:

      猜你喜欢
      • 2014-07-05
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多