Cuando añadimos varias unidades de producto a WooCommerce, el comportamiento habitual es que se añada una única línea en el carrito con las unidades solicitadas en el campo cantidad.
En algunos casos me he visto en la necesidad de que cada producto sea una única línea y si se piden, por ejemplo, 5 unidades de producto, se añadan 5 líneas. Para ello sólo necesitamos usar el siguiente código (ya sabéis, Code Snippets, functions.php
… como más os guste):
add_action( 'woocommerce_add_to_cart', 'alta_varias_lineas_pedido', 10, 6 );
function alta_varias_lineas_pedido( $cart_item_key, $product_id, $quantity,
$variation_id, $variation, $cart_item_data )
{
// Sólo si ha pedido más de una unidad, hacemos la separación en varias líneas
if ( $quantity > 1 )
{
// Mantenemos el producto, modificando la cantidad a 1
WC()->cart->set_quantity( $cart_item_key, 1 );
// Y damos de alta el resto de productos que solicita
for ( $i = 1; $i <= $quantity -1; $i++ )
{
// Damos de alta una nueva clave para cada línea de pedido
$cart_item_data['unique_key'] = md5( microtime() . rand() . "PedidoIndividual" );
// Añadimos el producto como una nueva línea
WC()->cart->add_to_cart( $product_id, 1, $variation_id, $variation, $cart_item_data );
}
}
}
En la zona de enlaces, os dejo la referencia del desarrollador que ha publicado el código que yo he adaptado. Pero como ya sabéis, hay que ser agradecido y con la gente que comparte código, más.
Y luego si hemos programado el sistema para que cada vez que añadimos un producto de más de una unidad, se separe en varias líneas de cantidad 1, lo lógico es evitar que en el carrito el usuario pueda editar la cantidad, ya que podría cambiar la cantidad 1, por cualquier otro valor.
Para ello, os dejo aquí otro fragmento de código que hace que ese campo sea de sólo lectura:
add_filter( 'woocommerce_cart_item_quantity', 'desactivar_edicion_cantidad_carrito', 10, 3 );
function desactivar_edicion_cantidad_carrito( $product_quantity, $cart_item_key, $cart_item ){
if(is_cart())
{
$product_quantity = sprintf( '%2$s <input type="hidden" name="cart[%1$s][qty]" value="%2$s" />', $cart_item_key, $cart_item['quantity'] );
}
return $product_quantity;
}