php 运输选项取决于推车重量和运输等级

2q5ifsrm  于 2023-01-12  发布在  PHP
关注(0)|答案(2)|浏览(108)

我正在使用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所有联邦快递航运选项和isset货运航运选项。
如果你需要我说得更清楚或者有什么建议就告诉我。
谢谢!

omqzjyyz

omqzjyyz1#

当你使用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文件。它应该工作。

mzsu5hc0

mzsu5hc02#

我找到了一个解决方案,这并不是我想要的,但它的工作。我所做的是改变推车重量超过300磅unset联邦快递航运选项。然后unset联邦快递航运选项的货运类。这仍然留下货运航运选项可见的非货运项目,我用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;
}

相关问题