根据购物车物品发货类取消设置WooCommerce送货方式

时间:2017-07-12 22:29:07

标签: php wordpress woocommerce cart shipping

我正在尝试取消平价运费方式,前提是购物车的产品包含和不包含运费等级。如果购物车中的所有产品都有运输等级,那么它应该保留。

拥有此送货方式:统一费率 - (flat_rate1)(instance_id = 1)

这些运输类别:50,100等,用同样的方式命名为Slugs:50,100 ......

统一运费方式已为这些运输类别设置了成本,此方法的主要成本和运费类别成本未设置,因此仅适用于购物车中已设置运输类别的产品。

搞定了

add_filter( 'woocommerce_package_rates', 'unset_shipping_for_unmatched_items', 100, 2 );

function unset_shipping_for_unmatched_items( $rates, $package ) {
    // Initialisation
    $shipping_classes = array( 50, 100, 150, 200, 250, 300 );
    $cart_items = WC()->cart->get_cart();
    $cart_items_count = WC()->cart->get_cart_contents_count();

    $items_match = false;

    $inArray    = 0;
    $notInArray = 0;

    foreach( $cart_items as $cart_item ){
        if( in_array( $cart_item[ 'data' ]->get_shipping_class(), $shipping_classes ) && $cart_items_count > 1 ) {
            $inArray++;
        } else {
            $notInArray++;
        }
    }
    if( ( $cart_items_count == $notInArray ) || ( $cart_items_count == $inArray ) ){
        $items_match = false;
    } else {
        $items_match = true;
    }

    if( $items_match )
        unset( $rates['flat_rate:6'] );

    return $rates;
}

1 个答案:

答案 0 :(得分:2)

在WooCommerce中,运输方式ID slugs有点不同,我的意思是有一个拼写错误。您需要在名称和广告中的数字之间添加 : 'flat_rate6'

此外,一旦您获得了匹配的购物车商品运送类,您就可以 break 循环。
最后一件事:这个钩子有两个可用的参数:$rates$package

所以你的代码将是:

add_filter( 'woocommerce_package_rates', 'hide_shipping_when_class_is_in_cart', 100, 2 ); 
function hide_shipping_when_class_is_in_cart( $rates, $package ) {
    // Initialisation
    $shipping_classes = array( 50, 100, 150, 200, 250, 300 );
    $class_exists = false;

    foreach( WC()->cart->get_cart() as $cart_item )
        if( in_array( $cart_item[ 'data' ]->get_shipping_class_id(), $shipping_classes ) ) {
            $class_exists = true;
            break; // Stop the loop
        }

    if( $class_exists ) 
        unset( $rates['flat_rate:6'] );

    return $rates;
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

现在应该可以了。