Oferta SiteGround Black Friday

Añadir más de un inventario en WooCommerce

Con el plugin WooCommerce puedes crear productos y asignarles una cantidad de inventario pero ¿y si tienes varios almacenes, cada uno con un stock diferente del mismo producto?

En los datos del producto de WooCommerce solo tienes un campo de inventario, y tendrías que andar sumando y restando cada vez, algo inviable para una tienda en línea con mucha actividad.

La solución está en añadir inventarios adicionales, indicando en cada campo la cantidad de productos disponibles en cada ubicación, y que de cara al cliente se muestre (o no) la suma de todos los stocks de producto.

Con el siguiente código lo conseguimos de este modo:

  1. Añadimos un campo adicional de inventario en los datos del producto.
  2. A medida que los clientes realizan pedidos se va reduciendo el inventario principal, el original de WooCommerce.
  3. Cuando el inventario principal llega a cero empieza a reducirse el inventario adicional, el nuevo que añadimos en el nuevo campo.

Lo mejor es que para el cliente es un proceso transparente, nuestros clientes verán, si así lo tenemos configurado, el inventario total sumado de ambos inventarios.

El código sería así:

/* Nueva ubicacion de inventario */
add_action( 'woocommerce_product_options_stock', 'ayudawp_inventario_adicional' );
function ayudawp_inventario_adicional() {
global $product_object;
echo '<div class="show_if_simple show_if_variable">';
woocommerce_wp_text_input(
array(
'id' => '_stock2',
'value' => get_post_meta( $product_object->get_id(), '_stock2', true ),
'label' => 'Inventario adicional',
'data_type' => 'stock',
)
);
echo '</div>';
}
add_action( 'save_post_product', 'ayudawp_guardar_inventario_adicional' );
function ayudawp_guardar_inventario_adicional( $product_id ) {
global $typenow;
if ( 'product' === $typenow ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( isset( $_POST['_stock2'] ) ) {
update_post_meta( $product_id, '_stock2', $_POST['_stock2'] );
}
}
}
add_filter( 'woocommerce_product_get_stock_quantity' , 'ayudawp_obtener_inventario_total', 9999, 2 );
function ayudawp_obtener_inventario_total( $value, $product ) {
$value = (int) $value + (int) get_post_meta( $product->get_id(), '_stock2', true );
return $value;
}
add_filter( 'woocommerce_product_get_stock_status' , 'ayudawp_obtener_estado_inventario_global', 9999, 2 );
function ayudawp_obtener_estado_inventario_global( $status, $product ) {
if ( ! $product->managing_stock() ) return $status;
$stock = (int) $product->get_stock_quantity() + (int) get_post_meta( $product->get_id(), '_stock2', true );
$status = $stock && ( $stock > 0 ) ? 'instock' : 'outofstock';
return $status;
}
add_filter( 'woocommerce_payment_complete_reduce_order_stock', 'ayudawp_reducir_inventario_adicional', 9999, 2 );
function ayudawp_reducir_inventario_adicional( $reduce, $order_id ) {
$order = wc_get_order( $order_id );
$atleastastock2change = false;
foreach ( $order->get_items() as $item ) { 
if ( ! $item->is_type( 'line_item' ) ) {
continue;
}
$product = $item->get_product();
$item_stock_reduced = $item->get_meta( '_reduced_stock', true );
if ( $item_stock_reduced || ! $product || ! $product->managing_stock() ) {
continue;
}
$qty = apply_filters( 'woocommerce_order_item_quantity', $item->get_quantity(), $order, $item );
$stock1 = (int) get_post_meta( $product->get_id(), '_stock', true );
if ( $qty <= $stock1 ) continue;
$atleastastock2change = true;
}
if ( ! $atleastastock2change ) return $reduce; 
foreach ( $order->get_items() as $item ) { 
if ( ! $item->is_type( 'line_item' ) ) {
continue;
}
$product = $item->get_product();
$item_stock_reduced = $item->get_meta( '_reduced_stock', true );
if ( $item_stock_reduced || ! $product || ! $product->managing_stock() ) {
continue;
} 
$item_name = $product->get_formatted_name();
$qty = apply_filters( 'woocommerce_order_item_quantity', $item->get_quantity(), $order, $item );
$stock1 = (int) get_post_meta( $product->get_id(), '_stock', true );
$stock2 = (int) get_post_meta( $product->get_id(), '_stock2', true );
if ( $qty <= $stock1 ) {
wc_update_product_stock( $product, $qty, 'decrease' );
$order->add_order_note( sprintf( 'Inventario reducido en el producto "%s"; Inventario 1: "%s" to "%s".', $item_name, $stock1, $stock1 - $qty ) );
} else { 
$newstock2 = $stock2 - ( $qty - $stock1 );
wc_update_product_stock( $product, $stock1, 'decrease' );
update_post_meta( $product->get_id(), '_stock2', $newstock2 );
$item->add_meta_data( '_reduced_stock', $qty, true );
$item->save(); 
$order->add_order_note( sprintf( 'Inventario reducido en el producto "%s"; Inventario 1: "%s" to "0" e Inventario 2: "%s" to "%s".', $item_name, $stock1, $stock2, $newstock2 ) );
}
}
$order->get_data_store()->set_stock_reduced( $order_id, true );
return false;
}

Solo tienes que añadir el código anterior a tu web con el método que prefieras y ya tendrás el campo adicional de inventario en los datos del producto:

inventario adicional woocommerce

Y ambos inventarios se sumarán a efectos del cliente:

varios inventarios woocommerce

Estoy seguro que este truco lo llevabas esperando hace mucho tiempo. Si te ha servido, por favor, compártelo en tus redes para que llegue a mucha más gente, es gratis, como el truco 😉

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en los emoticonos para valorarlo!

Promedio de puntuación 5 / 5. Total de votos: 4

Hasta ahora ¡no hay votos!. Sé el primero en valorar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en las redes sociales!

¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!

Sobre el autor

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información base sobre privacidad:
- Responsable: Fernando Tellado ([email protected])
- Fin del tratamiento: Moderación de comentarios para evitar spam
- Legitimación: Tu consentimiento
- Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal
- Derechos: Acceso, rectificación, portabilidad, olvido

 

Scroll al inicio