2015-02-27 3 views
4

Я создал плагин WooCommerce, который позволяет бесплатную доставку для подписчиков. Кажется, он сломался после недавнего обновления WooCommerce.WooCommerce - Как получить класс доставки товаров в функции calculate_shipping?

В частности, проблема в том, что класс доставки элементов корзины не может быть правильно восстановлен.

Вот мой код расчета_оплаты - может ли кто-нибудь сообщить, что не так?

/** 
* Add free shipping option for customers in base country with an active subscription, 
* but only if the cart doesn't contain an item with the 'heavy-item-shipping-class'. 
* 
* @access public 
* @param mixed $package 
* @return void 
*/ 
public function calculate_shipping($package) { 

    global $woocommerce; 

    // Check country and subscription status 
    if (is_user_in_base_country() && does_user_have_active_subscription()) { 

     // This flag will be set to TRUE if cart contains heavy items 
     $disable_free_shipping = FALSE; 

     // Get cart items 
     $cart_items = $package['contents']; 

     // Check all cart items 
     foreach ($cart_items as $cart_item) { 

      // Get shipping class 
      $shipping_class = $cart_item['data']->shipping_class; // *** IS THIS THE RIGHT WAY TO GET THE SHIPPING CLASS ??? *** 

      // If heavy item, set flag so free shipping option is not made available 
      if ($shipping_class === 'heavy-item-shipping-class') { 

       // Set flag 
       $disable_free_shipping = TRUE; 

       // Enough 
       break; 

      } 

     } 

     // If appropriate, add the free shipping option 
     if ($disable_free_shipping === FALSE) { 

      // Create the new rate 
      $rate = array(
       'id' => $this->id, 
       'label' => "Free Shipping", 
       'cost' => '0', 
       'taxes' => '', 
       'calc_tax' => 'per_order' 
      ); 

      // Register the rate 
      $this->add_rate($rate); 

     } 
     else { 

      // Doesn't qualify for free shipping, so do nothing 

     } 

    } 

} 

UPDATE Я посмотрел на %package массив и заметил, что теперь он содержит класс доставки под [shipping_class:protected]. (Раньше это должно было быть [shipping_class].) Можно ли извлечь эти данные? Если нет, то каков правильный способ сделать это?

ответ

10

Я нашел решение. Теперь, кажется, единственный способ получить класс доставки продукта/предмета - это позвонить get_shipping_class().

Итак, в моем фрагменте кода выше, я изменил ...

$shipping_class = $cart_item['data']->shipping_class;

... до ...

$shipping_class = $cart_item['data']->get_shipping_class();

Надеюсь, это поможет кому-то еще , :)

Смежные вопросы