【问题标题】:Shipping options depending on cart weight and shipping class运输选项取决于购物车重量和运输等级
【发布时间】:2019-01-01 05:58:02
【问题描述】:

我正在开发一个使用 WooCommerce 的 WordPress 网站。我发现这段代码允许我根据重量设置货运选项。如果在产品上选择了货运类别,则在客户还想要相同的货运选项之前,它一直很有效。

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 货运,因为我们通过购物车重量unset 它。但是,我遇到了一个问题,即不能再将货运等级设置为isset 而不会引起重大问题。以下是我尝试为货运做的事情。

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 所有 FedEx 运输选项和 isset 货运选项做完全相同的事情。

如果您需要我说得更清楚,或者您有任何提示,请告诉我。

谢谢!

【问题讨论】:

  • 我已经在这里回答了,因为您可以真正简化并将您的代码合并到一个独特的功能中......请看一下,您的反馈将不胜感激。

标签: php wordpress woocommerce shipping isset


【解决方案1】:

由于您使用了 2 次相同的钩子,您可以简单地将函数合并为一个。

现在使用 php [isset()][1],您需要在 IF 语句中将其用作条件,以检查变量是否已设置(存在),但仅在函数中的 IF 语句之外没有任何影响。

因此,在您的第一个函数中,以下内容没有任何效果:

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

所以你可以试试这个简洁高效的代码:

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 文件中。它应该可以工作。

【讨论】:

    【解决方案2】:

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

    我仍然愿意寻找更好的方法来做到这一点。因此,如果您有建议,请以我的方式发送给他们。

    下面是我最终做的事情。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-22
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      相关资源
      最近更新 更多