2017-07-12 23 views
1

我试图只在购物车有产品时才会包含和不包含运输类别时才会解除统一运费方式。如果购物车中的所有产品都有运输类,那么它应该停留。根据购物车项目运输类别取消设置WooCommerce运输方式

有这种运输方式:固定费率 - (flat_rate1)(INSTANCE_ID = 1)

而且这些航运类:50,100等,以同样的方式命名蛞蝓: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

在WooCommerce的运输方法ID蛞蝓有一点不同,我的意思是有一个错字错误。您将需要添加:之间的名字和数字在slug:'flat_rate6'

此外,一旦你得到一个匹配的购物车项目航运类,你可以break循环。
最后一件事:此挂钩有2个可用参数:$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文件或也以任何插件文件。

这应该现在工作。

+0

得到它的工作,需要使用get_shipping_class()来代替slug来使用数组。还有一些计数来检查物品类是否与运输类数组相匹配。 – Aivaras

相关问题