Perhitungan bidang stok khusus berdasarkan nilai stok Produk WooCommerce saat ini
Saya berusaha untuk meningkatkan manajemen inventaris saya dan melakukannya langsung dari WooCommerce (Sehingga tidak perlu menggunakan perhitungan file CSV eksternal)
Saya perlu tahu berapa banyak dari setiap produk yang perlu saya pesan (Stok hilang). Untuk menentukan ini saya menghitung menggunakan nilai asli _stock dan 2 bidang khusus:
_missing_stock : Jumlah stok yang hilang / berapa banyak stok yang perlu saya pesan
_ref_stock : Nomor stok referensi (diatur secara manual, jumlah stok yang diinginkan di gudang)
jadi: Stok Hilang = Stok referensi - Nilai saham
Tujuannya adalah untuk secara otomatis menghitung dan memperbarui nilai Stok Hilang berdasarkan Stok Referensi yang telah ditetapkan dan Stok Saat Ini dari produk tersebut. Karena stok produk menurun seiring dengan pembelian, dengan ini saya dengan cepat dapat melihat berapa banyak stok dari setiap produk yang perlu dipesan.
Berdasarkan perhitungan harga reguler Produk berdasarkan 2 bidang khusus di kode jawaban Woocommerce 3 yang memiliki beberapa kesamaan Saya telah berhasil membuat bidang khusus dan sejauh ini.
Namun saya tidak dapat mengetahui bagaimana akhirnya secara otomatis memperbarui nilai _missing_stock secara otomatis.
Ini adalah kode yang berhasil saya temukan, secara alami (dan mungkin) tidak sepenuhnya benar.
// 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 );
}
Terima kasih sebelumnya atas perhatian dan nasehatnya.
Jawaban
Kode yang sudah Anda gunakan dan telah Anda sesuaikan sedikit lebih ekstensif daripada pertanyaan Anda, jadi di bawah ini adalah versi yang disederhanakan.
Anda memang bisa menggunakan woocommerce_admin_process_product_object
saat Anda akan menyimpan penyesuaian di backend untuk menentukan nilai bidang kustom.
Namun, setelah pesanan saat penyesuaian stok dilakukan, nilai bidang khusus Anda tidak akan secara otomatis menyesuaikan.
Untuk itu Anda bisa menggunakan woocommerce_product_set_stock
action hook.
Kode ini ditulis untuk produk 'sederhana' tetapi dapat dengan mudah diperluas ke jenis produk lain jika diinginkan.
Penjelasan melalui tag komentar ditambahkan melalui dalam kode
// 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 );