WooCommerce 제품의 현재 재고 가치를 기반으로 사용자 지정 재고 필드 계산

Nov 29 2020

재고 관리를 개선하기 위해 노력하고 있으며 WooCommerce에서 직접 수행하고 있습니다 (외부 CSV 파일 계산을 사용할 필요가 없도록)

주문해야하는 각 제품의 수량 (재고 없음)을 알고 싶습니다. 이를 결정하기 위해 _stock 기본 값과 2 개의 사용자 정의 필드를 사용하여 계산 합니다.

_missing_stock : 누락 된 재고 수량 / 주문해야하는 재고 수량

_ref_stock : 참조 재고 번호 (수동 설정, 창고에 원하는 재고 수량)

따라서 : 재고 누락 = 참조 재고-재고 가치


설정된 기준 재고와 제품의 현재 재고를 기반으로 누락 재고 값을 자동으로 계산하고 업데이트하기위한 것입니다. 구매에 따라 제품 재고가 낮아 지므로이를 통해 각 제품의 재고 수량을 빠르게 확인할 수 있습니다.

우 커머스 3 응답 코드의 2 개의 사용자 정의 필드를 기반으로 제품 정가 계산을 기반으로합니다.이 코드는 사용자 정의 필드를 만들고 지금까지 몇 가지 유사점이 있습니다.

그러나 최종적으로 _missing_stock 값을 자동으로 업데이트하는 방법을 알 수 없습니다.

이것은 내가 자연스럽게 (아마도) 완전히 정확하지 않은 코드입니다.

// Adding and displaying additional Stock custom fields
add_action( 'woocommerce_product_options_stock_status', 'additional_product_stock_option_fields', 50 );
function additional_product_stock_option_fields() {
    $domain = "woocommerce"; global $post;

    echo '</div><div class="options_group stock show_if_simple show_if_external show_if_composite">';

    woocommerce_wp_text_input( array(
        'id'            => '_ref_stock',
        'label'         => __("Reference Stock", $domain ), 'placeholder' => '', 'description' => __("Amount of desired target stock in warehouse )", $domain ),
        'desc_tip'      => true,
    ) );


    woocommerce_wp_text_input( array(
        'id'            => '_missing_stock',
        'label'         => __("Missing Stock", $domain ) . ' ('. get_woocommerce_currency_symbol() . ')', 'placeholder' => '', 'description' => __("Amount of stock that needs to be ordered", $domain ),
        'desc_tip'      => true,
    ) );

    echo '<input type="hidden" name="_custom_stock_nonce" value="' . wp_create_nonce() . '">';

}

// Utility function that save "Reference Stock" and "missing_stock" custom fields values
function saving_ref_stock_and_missing_stock( $product ) { // Security check if ( isset($_POST['_custom_stock_nonce']) && ! wp_verify_nonce($_POST['_custom_stock_nonce']) ) { return; } // Save "Reference Stock" and "missing_stock" custom fields values if( isset($_POST['_ref_stock']) && isset($_POST['_missing_stock']) ) { $product->update_meta_data('_ref_stock', sanitize_text_field( (float) $_POST['_ref_stock'] ) ); $product->update_meta_data('_missing_stock', sanitize_text_field( (float) $_POST['_missing_stock'] ) ); } } // Utility function: Calculate and save product "missing stock" custom field from the "Reference Stock" custom field and the "Stock" field function calculate_and_save_new_product_stock( $product ) {

// Check if product stock management is enabled
 if ( !$product->managing_stock() ) { // Calculate and save the missing stock if( isset($_POST['_ref_stock']) && isset($_POST['_missing_stock']) && $_POST['_ref_stock'] > 0 && $_POST['_missing_stock'] > 0 ) { // Catch the stock data $ref_stock    = (float) $_POST['_ref_stock']; $missing_stock = (float) $_POST['_missing_stock']; $current_stock   = (float) $product->get_stock_quantity(); // Calculating missing stock $missing_stock  = $ref_stock - $current_stock;

     
        }
    }
}

// Saving and calculating Stock values
add_action( 'woocommerce_admin_process_product_object', 'update_product_meta_data', 100, 1 );
function update_product_meta_data( $product ) { // Saving "Reference Stock" and "missing_stock" custom fields values saving_ref_stock_and_missing_stock( $product ); // <== To be removed if not used with the first function

    // Calculate and save Missing Stock from the "Reference Stock" and the "Stock" custom fields
    calculate_and_save_new_product_missing_stock( $product );
}

관심과 조언에 미리 감사드립니다.

답변

1 7uc1f3r Nov 29 2020 at 22:26

이미 사용하고 수정 한 코드는 질문보다 약간 더 광범위하므로 아래는 단순화 된 버전입니다.

woocommerce_admin_process_product_object사용자 지정 필드의 값을 결정하기 위해 백엔드에 조정을 저장할 때 실제로 사용할 수 있습니다 .

그러나 주문 후 재고 조정이 발생하면 사용자 정의 필드의 값이 자동으로 조정되지 않습니다.

이를 위해 woocommerce_product_set_stock액션 후크를 사용할 수 있습니다 .

이 코드는 '단순'제품 용으로 작성되었지만 원하는 경우 다른 유형의 제품으로 쉽게 확장 할 수 있습니다.

코드에 추가 된 주석 태그를 통한 설명

// Adding and displaying additional custom fields
function action_woocommerce_product_options_stock_status() {
    $domain = 'woocommerce'; echo '</div><div class="options_group">'; woocommerce_wp_text_input( array( 'id' => '_ref_stock', 'label' => __( 'Reference Stock', $domain ),
        'placeholder'        => '',
        'description'        => __( 'Amount of desired target stock in warehouse', $domain ), 'desc_tip' => true, )); woocommerce_wp_text_input( array( 'id' => '_missing_stock', 'label' => __( 'Missing Stock', $domain ),
        'placeholder'        => '',
        'description'        => __( 'Amount of stock that needs to be ordered', $domain ), 'desc_tip' => true, 'custom_attributes' => array( 'readonly' => 'readonly' ), )); } add_action( 'woocommerce_product_options_stock_status', 'action_woocommerce_product_options_stock_status', 10, 1 ); // Save custom field function action_woocommerce_admin_process_product_object( $product ) {
    // Isset
    if ( isset( $_POST['_ref_stock'] ) ) { // ID & value $ref_stock_id = '_ref_stock';
        $ref_stock_val = sanitize_text_field( $_POST['_ref_stock'] );
        
        // Update ref stock
        $product->update_meta_data( $ref_stock_id, $ref_stock_val ); // Get stock quantity $current_stock = (float) $product->get_stock_quantity(); // NOT empty if ( ! empty ( $current_stock ) ) {
            // ID
            $missing_stock_id = '_missing_stock'; // Calculating missing stock $missing_stock_val = $ref_stock_val - $current_stock;
            
            // Update missing stock
            $product->update_meta_data( $missing_stock_id, $missing_stock_val ); } } } add_action( 'woocommerce_admin_process_product_object', 'action_woocommerce_admin_process_product_object', 10, 1 ); // When the stock changed function action_woocommerce_product_set_stock ( $product_with_stock ) {
    global $pagenow; // Exit if ( is_admin() && $pagenow === 'post.php' )
        return;
    
    // Get meta
    $ref_stock_val = $product_with_stock->get_meta( '_ref_stock' );
    
    // NOT empty
    if ( ! empty ( $ref_stock_val ) ) { // Get stock quantity $current_stock = (float) $product_with_stock->get_stock_quantity(); // NOT empty if ( ! empty ( $current_stock ) ) {
            // ID
            $missing_stock_id = '_missing_stock'; // Calculating missing stock $missing_stock_val = $ref_stock_val - $current_stock;
            
            // Update missing stock
            $product_with_stock->update_meta_data( $missing_stock_id, $missing_stock_val ); // Save $product_with_stock->save();
        }       
    }
}
add_action( 'woocommerce_product_set_stock', 'action_woocommerce_product_set_stock', 10, 1 );