WooCommerce: posizione aggiuntiva dell'inventario delle scorte
Pubblicato: 2022-12-07Il plug-in WooCommerce ti consente di gestire lo stock per ogni prodotto, ma hai un solo campo per la quantità di stock!
Cosa succede se si dispone di due magazzini e, in qualità di amministratore del negozio, è necessario gestire l'inventario per ciascuna sede ? Inoltre, cosa succede se un articolo è esaurito nella posizione 1, ma è disponibile nella posizione 2 e quindi il cliente deve poterlo acquistare?
Questa straordinaria soluzione alternativa aggiungerà un secondo numero di input nelle impostazioni del prodotto, ridefinirà la quantità e lo stato dello stock sul frontend sommando lo stock 1 + lo stock 2 e infine ridurrà lo stock 1 fino a raggiungere 0, dopodiché diminuirà lo stock 2.
Questo comportamento predefinito può essere ovviamente modificato, ad esempio è possibile definire da dove viene ridotto lo stock (per distanza?) tramite codice aggiuntivo. Inoltre, è possibile scrivere un codice aggiuntivo per renderlo compatibile con prodotti variabili o tipi di prodotti personalizzati, oltre a farlo funzionare con i rimborsi. Ad ogni modo, divertiti!
Snippet PHP: gestione della seconda posizione di magazzino
/**
* @snippet Second Stock Location @ WooCommerce Edit Product
* @how-to Get CustomizeWoo.com FREE
* @author Rodolfo Melogli
* @compatible WooCommerce 7
* @donate $9 https://businessbloomer.com/bloomer-armada/
*/
add_action( 'woocommerce_product_options_stock', 'bbloomer_additional_stock_location' );
function bbloomer_additional_stock_location() {
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' => '2nd Stock Location',
'data_type' => 'stock',
)
);
echo '</div>';
}
add_action( 'save_post_product', 'bbloomer_save_additional_stock' );
function bbloomer_save_additional_stock( $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' , 'bbloomer_get_overall_stock_quantity', 9999, 2 );
function bbloomer_get_overall_stock_quantity( $value, $product ) {
$value = (int) $value + (int) get_post_meta( $product->get_id(), '_stock2', true );
return $value;
}
add_filter( 'woocommerce_product_get_stock_status' , 'bbloomer_get_overall_stock_status', 9999, 2 );
function bbloomer_get_overall_stock_status( $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', 'bbloomer_maybe_reduce_second_stock', 9999, 2 );
function bbloomer_maybe_reduce_second_stock( $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( 'Reduced stock for item "%s"; Stock 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( 'Reduced stock for item "%s"; Stock 1: "%s" to "0" and Stock 2: "%s" to "%s".', $item_name, $stock1, $stock2, $newstock2 ) );
}
}
$order->get_data_store()->set_stock_reduced( $order_id, true );
return false;
}
In parole povere:
- bbloomer_additional_stock_location mostra il secondo campo della quantità dello stock
- bbloomer_save_additional_stock salva l'importo dello stock personalizzato
- bbloomer_get_overall_stock_quantity imposta l'inventario dello stock del prodotto su stock 1 + stock 2
- bbloomer_get_overall_stock_status imposta lo stato dello stock del prodotto in base allo stock 1 + allo stock 2
- bbloomer_maybe_reduce_second_stock diminuisce lo stock dallo stock 1 e poi dallo stock 2 nel caso in cui la quantità ordinata sia maggiore dello stock 1, altrimenti lascia che WooCommerce esegua la riduzione predefinita dello stock