首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >托运选项取决于手推车重量和运输类别

托运选项取决于手推车重量和运输类别
EN

Stack Overflow用户
提问于 2018-07-24 14:45:32
回答 2查看 333关注 0票数 1

我正在开发一个使用WordPress的WooCommerce站点。我找到了这段代码,它允许我根据重量设置货运选项。这是很好的工作,直到客户也想要相同的货运选择,如果货物运输类被选择在一个产品。

代码语言:javascript
运行
复制
add_filter( 'woocommerce_package_rates', 'bbloomer_woocommerce_tiered_shipping', 10, 2 );

function bbloomer_woocommerce_tiered_shipping( $rates, $package ) {

  if ( WC()->cart->cart_contents_weight < 300 ) {

    if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );

  } else {

    if ( isset( $rates['flat_rate:10'] ) ) unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND'] );
  }

return $rates;
}

然后,我找到了另一段代码,它可以将传送类设置为传递选项。我发现的代码对于可用的unset运输选项非常重要,但是我想通过购物车重量来isset货运,因为我们通过购物车重量来运输它。但是,我遇到了一个问题,在不引起重大问题的情况下,不能再将货运类设置为isset。下面是我为货运所做的努力。

代码语言:javascript
运行
复制
add_filter( 'woocommerce_package_rates', 'freight_shipping_class_only', 10, 2 );

function freight_shipping_class_only( $rates, $package ) {

  $shipping_class_target = 193;
  $in_cart = false;
  foreach( WC()->cart->cart_contents as $key => $values ) {
    if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
      $in_cart = true;
      break;
    } 
  }
  if( $in_cart ) {
    unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND']  ); // shipping method with ID (to find it, see screenshot below)
    isset( $rates['flat_rate:10'] );
  }
  return $rates;
} 

是否有一种方法可以同时设置购物车重量和货运等级?这将是理想的,因为我希望他们都做完全相同的事情,unset,all,FedEx,航运选项和isset货运选择。

如果你需要我说得更清楚,或者你有什么建议,请告诉我。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-24 16:00:36

由于您正在使用2倍于同一个钩子,您可以简单地合并您的函数在一个。

现在,对于php [isset()][1],您需要将它作为IF语句中的一个条件来检查是否设置了一个变量(exist),但是它在函数中的if语句之外并没有单独的影响。 因此,在第一个函数中,以下内容没有任何效果: 如果($rates‘FEDEX:优先级_隔夜’,$rates'fedex:FEDEX_2_DAY',$rates'fedex:FEDEX_GROUND‘);

因此,您可以尝试以下简洁高效的代码:

代码语言:javascript
运行
复制
add_filter( 'woocommerce_package_rates', 'freight_shipping_class_only', 20, 2 );
function freight_shipping_class_only( $rates, $package ) {
    // HERE the targeted shipping class ID
    $targeted_shipping_class = 193;

    // Loop through cart items and checking
    $found = false;
    foreach( $package['contents'] as $item ) {
        if( $item['data']->get_shipping_class_id() == $targeted_shipping_class ){
            $found = true;
            break;
        }
    } 
    
    // The condition
    if ( isset( $rates['flat_rate:10'] ) && ( WC()->cart->get_cart_contents_weight() >= 300 || $found ) ){
        unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] );
    }

    return $rates;
}

代码位于活动子主题(或活动主题)的function.php文件中。应该管用的。

票数 0
EN

Stack Overflow用户

发布于 2018-07-24 15:45:01

我找到了一个解决方案,这不是我想要的,但它有效。我所做的就是将购物车重量改为超过300磅的unset,FedEx运输选项。然后是货运类的unset FedEx船运选项。这仍然使货运选项在非货运项目上可见,我使用CSS隐藏了这些选项。

我仍然有一个更好的方法来做这件事。所以,如果你有建议,请寄给我。

下面是我最后所做的。

代码语言:javascript
运行
复制
add_filter( 'woocommerce_package_rates', 'bbloomer_woocommerce_tiered_shipping', 10, 2 );

function bbloomer_woocommerce_tiered_shipping( $rates, $package ) {

if ( WC()->cart->cart_contents_weight < 300 ) {

    if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );

} else {

    if ( isset( $rates['flat_rate:10'] ) ) unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND'] );
}

 return $rates;
}

/** Freight Shipping Class Only **/
add_filter( 'woocommerce_package_rates', 'freight_shipping_class_only', 10, 2 );

function freight_shipping_class_only( $rates, $package ) {
    $shipping_class_target = 193; 
    $in_cart = false;
    foreach( WC()->cart->cart_contents as $key => $values ) {
        if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
           $in_cart = true;
           break;
        } 
     }
     if( $in_cart ) {
        unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND']  );
     }
     return $rates;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51501544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档