Woocommerce根据条件设置运输类

时间:2017-09-26 13:27:17

标签: php wordpress woocommerce hook-woocommerce

首先,我要感谢您花时间阅读问题。代码通常会引用荷兰语,请告诉我是否需要翻译才能理解代码。

情况: 如果满足某些条件,我已经编写了一个自定义功能来取消设置某些运输类别,以确保只有一个选项可供客户看到。

以下是对条件的描述以及我想要完成的事情:

  • 如果有人订购两个或更多条款标有运费类" briefpost" ,则运费应等于& #34;包"
  • 如果订单包含"免费送货和保险" ,请将免费保险添加到购物车

现在我已经编写了代码来实现这一目标。它半成品。我只介绍了一个错误,如果您在结帐时选择其他送货国家(荷兰除外),结帐将会显示为灰色,您将无法完成订单。

我一直在调试函数以查看它出错的地方并得出结论,即使没有任何代码行,add_filter部分也会出错。一旦在我的主题的functions.php中引入这一点,就无法完成除荷兰以外的其他国家的结账(它甚至可以为某些用户打破网站)。

现在,下面的一些代码示例是我使用的过滤器:

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

正在调用的实际函数:

function unset_shipping_when_free_is_available_in_zone( $rates, $package ) {
 global $woocommerce;

 $shipping_class_target = briefpost;
 $shipping_class_id = 58;
 $shipping_class_package_id = 47;
 $free_insurance = 2134;
 $insurance_found = false;
 $no_package = true;

 $number_of_briefpost = 0;

 foreach( WC()->cart->get_cart() as $cart_item_key => $values ) {
   $_product = $values['data'];

   $terms = get_the_terms($_product->get_id(), $shipping_class_target);
   $shipping_class = $values['data']->get_shipping_class_id();

   if ($shipping_class === $shipping_class_id) {
      $rates['flat_rate:4']->label = 'Mailbox';
      $number_of_briefpost += $values['quantity'];
   } else if($shipping_class === $shipping_class_package_id) {
      $rates['flat_rate:4']->label = 'Parcel';
      $no_package = false;
   } else if($_product->get_id() == $free_insurance) {
      $insurance_found = true;
      $prod_unique_id = WC()->cart->generate_cart_id( $_product->get_id() );
   }
 }

 if ($number_of_briefpost > 1 && $no_package) {
   $rates['flat_rate:4']->cost = $rates['flat_rate:4']->cost + 2.30;
   $rates['flat_rate:4']->label = 'Parcel';
 }

 if (isset( $rates['free_shipping:13'] ) ) {
  unset( $rates['flat_rate:4'] );
   if( !$insurance_found ) {
     WC()->cart->add_to_cart($free_insurance, 1);
   }
 }

  if (isset( $rates['flat_rate:4'])) {
    if($insurance_found) {
     unset( WC()->cart->cart_contents[$prod_unique_id] );
    }
  }

  return $rates;
}

非常感谢所有帮助!

编辑:我也打开了有关符合我确切需求的付费解决方案的建议。然而,到目前为止,在我的搜索中,我没有找到。

0 个答案:

没有答案