WooCommerce: Zusätzlicher Lagerbestandsstandort
Veröffentlicht: 2022-12-07Mit dem WooCommerce-Plugin können Sie den Lagerbestand für jedes Produkt verwalten, aber Sie haben nur ein einziges Feld für die Lagerbestandsmenge!
Was ist, wenn Sie zwei Lager haben und als Geschäftsadministrator den Bestand für jeden Standort verwalten müssen ? Was ist außerdem, wenn ein Artikel an Standort 1 nicht vorrätig ist, aber an Standort 2 vorrätig ist und der Kunde ihn daher kaufen muss?
Diese erstaunliche Problemumgehung fügt eine zweite Eingabenummer in den Produkteinstellungen hinzu, definiert die Bestandsmenge und den Status im Frontend neu, indem Bestand 1 + Bestand 2 summiert werden, und verringert schließlich Bestand 1, bis er auf 0 geht, wonach Bestand 2 verringert wird.
Dieses Standardverhalten kann natürlich geändert werden, zB kann per Zusatzcode definiert werden, ab wann der Bestand (nach Entfernung?) reduziert wird. Außerdem kann zusätzlicher Code geschrieben werden, um ihn mit variablen Produkten oder benutzerdefinierten Produkttypen kompatibel zu machen und mit Rückerstattungen zu arbeiten. Wie auch immer, viel Spaß!
PHP-Snippet: Zweite Lagerplatzverwaltung
/**
* @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 reinem Englisch:
- bbloomer_additional_stock_location zeigt das zweite Bestandsmengenfeld
- bbloomer_save_additional_stock speichert die benutzerdefinierte Lagermenge
- bbloomer_get_overall_stock_quantity setzt den Produktbestand auf Bestand 1 + Bestand 2
- bbloomer_get_overall_stock_status setzt den Produktbestandsstatus basierend auf Bestand 1 + Bestand 2
- bbloomer_maybe_reduce_second_stock verringert den Bestand von Bestand 1 und dann von Bestand 2, falls die bestellte Menge größer als Bestand 1 ist, andernfalls lässt es WooCommerce die standardmäßige Bestandsverringerung vornehmen