隐藏在Woocommerce中专门针对产品类别的统一运费

时间:2018-05-22 20:10:52

标签: php wordpress woocommerce shipping custom-taxonomy

这是此问题的扩展:Remove shipping Flat Rate method for particular Category in WooCommerce 2.6 and 3+

使用Woo Smart Coupons插件购买礼品卡产品。这个HAS设置为Variation,因为我们有多个层可供选择。 (这排除了虚拟产品)礼品卡有自己的区别。我们设置了两种送货方式:统一费率+本地取件。将礼品卡的送货选项发送到您的收件箱是非常愚蠢的,所以我使用了以上链接中的以下代码段:

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 = 'coupons-gift-cards';
$prod_cat = false;

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

像魅力一样......直到你添加一个不属于该类别的产品。如果有人决定他们想要礼品卡和普通产品,那么常规运输选项需要重新到位。

编辑:选中的答案完美无缺!如果您想更改上述情况下的项目的分拣标签,那么他们会说“下载”而不是“代答”,那么在IF语句之后添加此行,以检查哪些产品与类别匹配

foreach( $rates as $rate_key => $rate ) {
//change local_pickup:1 to your shipping method
    if ( 'local_pickup:1' == $rate_key){
//set the text for the label
        $rates[$rate_key]->label = __( 'Download', 'woocommerce' );
    }
}

1 个答案:

答案 0 :(得分:2)

以下是使其适用于独特且独有的产品类别的正确方法,如果此产品类别中没有其他产品,则会隐藏统一费率:

add_filter( 'woocommerce_package_rates', 'hide_shipping_flat_rate_conditionaly', 90, 2 );
function hide_shipping_flat_rate_conditionaly( $rates, $package ){

    // HERE Define your product category (ID, slug or name or an array of values)
    $term   = 'coupons-gift-cards';
    $others = $found = false;

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product_id = $cart_item['product_id'];
        if ( has_term( $term, 'product_cat', $cart_item['product_id'] ) )
            $found = true;
        else
            $others = true;
    }

    if ( $found && ! $others ) {
        foreach($rates as $rate_id => $rate) {
            if ('flat_rate' === $rate->method_id )
                unset($rates[ $rate_id ]);
        }
    }
    return $rates;
}

代码会出现在您的活动子主题(或活动主题)的function.php文件中。

此代码经过测试且功能齐全(如果您已正确设置运送区域,则可以正常运行)

  

您可能需要刷新送货缓存数据:禁用,保存并启用,在Woocommerce送货设置中保存当前送货区的相关送货方式。