logooneasesoria4

¿Necesita una consulta gratuita?

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 😉

¿Te gustó este artículo?
18 de abril de 2023

RECIBE

GRATIS

Recursos para tu web GRATIS.

En agradecimiento por haber leido nuestro blog te ofrecemos algúnos plugins, temas y asesoría para el desarrollo de tu sitio web.
Envía correo y espera respuesta...Gracias..!
baneranunciopluginsbest
Publicaciones Relacionadas
Abrir chat
One Asesoría
Hola 👋
¿Necesita cotizar una página o tienda online, cómo podemos ayudarle..?