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?
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. 🙂
¿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