WooCommerce-如何在calculate_shipping函数中获得购物车项目的运输类


WooCommerce - How to get shipping class of cart items in calculate_shipping function?

我创建了一个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
        }
    }
}

更新我查看了%package数组,注意到它现在包含[shipping_class:protected]下的装运类。(以前,这一定是[shipping_class]。)有可能提取这些数据吗?如果没有,正确的做法是什么?

我找到了解决方案。现在,获得产品/项目的运输类别的唯一方法似乎是调用get_shipping_class()

所以,在上面的代码片段中,我更改了。。。

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

到…

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

希望这能帮助其他人。:)