WooCommerce: 추가 재고 인벤토리 위치
게시 됨: 2022-12-07WooCommerce 플러그인을 사용하면 각 제품의 재고를 관리할 수 있지만 재고 수량 필드는 하나뿐입니다!
두 개의 창고가 있고 매장 관리자로서 각 위치의 재고를 관리해야 하는 경우 어떻게 합니까? 게다가 위치 1에는 품목이 품절되었지만 위치 2에는 재고가 있어 고객이 구매할 수 있어야 하는 경우는 어떻게 됩니까?
이 놀라운 해결 방법은 제품 설정에 두 번째 입력 번호를 추가하고, 재고 1 + 재고 2를 합산하여 프론트엔드의 재고 수량과 상태를 재정의하고, 마지막으로 재고 1을 0이 될 때까지 줄인 다음 재고 2를 줄입니다.
이 기본 동작은 물론 변경할 수 있습니다. 예를 들어 추가 코드를 통해 재고가 줄어드는 위치(거리별?)를 정의할 수 있습니다. 또한 가변 제품 또는 맞춤형 제품 유형과 호환되도록 추가 코드를 작성하고 환불이 가능하도록 할 수 있습니다. 어느 쪽이든 즐기세요!
PHP 스니펫: 두 번째 재고 위치 관리
/**
* @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;
}
평이한 영어:
- bbloomer_additional_stock_location 은 두 번째 재고 수량 필드를 보여줍니다.
- bbloomer_save_additional_stock 은 맞춤 재고 금액을 저장합니다.
- bbloomer_get_overall_stock_quantity 는 제품 재고 재고를 재고 1 + 재고 2로 설정합니다.
- bbloomer_get_overall_stock_status 는 재고 1 + 재고 2를 기준으로 제품 재고 상태를 설정합니다.
- bbloomer_maybe_reduce_second_stock 은 주문 수량이 재고 1보다 큰 경우 재고 1에서 재고를 줄인 다음 재고 2에서 줄입니다. 그렇지 않으면 WooCommerce가 기본 재고를 줄입니다.