WooCommerce: Ek Stok Envanteri Konumu

Yayınlanan: 2022-12-07

WooCommerce 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!

İşte ikinci stok alanı. Bu durumda, varsayılan depoda stok miktarı 0'dır, yani teknik olarak ürün stokta yoktur. Aşağıdaki snippet ile ve Konum 2'de stokta 1 ürün olduğu gerçeğiyle, ürün aslında "1" miktarıyla "stokta"dır. Sipariş üzerine azalan miktardır.

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