WooCommerce: ¿cómo obtener la clase de envío de los artículos del carrito en la función de cálculo_envío?

2 minutos de lectura

avatar de usuario
ban-geoingeniería

Creé un complemento de WooCommerce que permite el envío gratuito para los suscriptores. Parece haberse roto después de una actualización reciente de WooCommerce.

Específicamente, el problema parece que la clase de envío de los artículos del carrito no se recupera correctamente.

Aquí está mi código de cálculo de envío: ¿alguien puede aconsejarme qué está mal?

/**
 * 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

        }

    }

}

ACTUALIZAR
he mirado el %package matriz y noté que ahora contiene la clase de envío en [shipping_class:protected]. (Anteriormente, esto debe haber sido [shipping_class].) ¿Es posible extraer estos datos? Si no, ¿cuál es la forma correcta de hacerlo?

  • ¿Qué es $paquete? ¿Es ese un objeto de pedido de WC?

    – mixdev

    13 mayo 2020 a las 14:29

  • No, es solo una matriz simple que WooCommerce pasa al calculate_shipping funcionar como un parámetro. De acuerdo a docs.woocommerce.com/wc-apidocs/class-WC_Shipping.html es un matriz multidimensional de artículos del carrito para calcular el envío para.

    – ban-geoingeniería

    13 mayo 2020 a las 18:27

Encontré la solución. Ahora, parece que la única forma de obtener la clase de envío de un producto/artículo es llamar get_shipping_class() en eso.

Entonces, en mi fragmento de código, arriba, cambié…

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

…a…

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

Con suerte, esto ayudará a alguien más. 🙂

¿Ha sido útil esta solución?