WooCommerce: Ek Stok Envanteri Konumu
Yayınlanan: 2022-12-07WooCommerce eklentisi, her ürün için stoğu yönetmenize olanak tanır, ancak yalnızca tek bir stok miktarı alanınız vardır!
Ya iki deponuz varsa ve bir mağaza yöneticisi olarak her bir konum için envanteri yönetmeniz gerekiyorsa ? Ayrıca, bir ürün 1. konumda stokta yoksa ve 2. konumda stokta varsa ve bu nedenle müşterinin ürünü satın alabilmesi gerekiyorsa ne olur?
Bu şaşırtıcı geçici çözüm, ürün ayarlarında ikinci bir giriş numarası ekleyecek, stok 1 + stok 2'yi toplayarak ön uçta stok miktarını ve durumunu yeniden tanımlayacak ve son olarak stok 1'i 0'a gidene kadar azaltacak, ardından stok 2'yi azaltacaktır.
Bu varsayılan davranış elbette değiştirilebilir, örneğin ek kod aracılığıyla stoğun nereden azaltılacağını (mesafeye göre?) tanımlamak mümkündür. Ayrıca değişken ürünlere veya özel ürün çeşitlerine uyumlu hale getirmek ve iade ile çalışmasını sağlamak için ek kod yazılabilir. Her iki durumda da tadını çıkarın!
PHP Snippet: İkinci Stok Konum Yönetimi
/**
* @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;
}
Sade ingilizce:
- bbloomer_additional_stock_location , ikinci stok miktarı alanını gösterir
- bbloomer_save_additional_stock , özel stok miktarını kaydeder
- bbloomer_get_overall_stock_quantity , ürün stok envanterini stok 1 + stok 2 olarak ayarlar
- bbloomer_get_overall_stock_status , stok 1 + stok 2'ye göre ürün stok durumunu ayarlar
- bbloomer_maybe_reduce_second_stock , sipariş edilen miktarın stok 1'den büyük olması durumunda stoğu stok 1'den ve ardından stok 2'den düşürür, aksi takdirde WooCommerce'in varsayılan stok azaltma işlemini yapmasına izin verir