Benutzerdefinierte Bestandsfeldberechnung basierend auf dem aktuellen Bestandswert des WooCommerce-Produkts
Ich bemühe mich, meine Bestandsverwaltung zu verbessern und dies direkt von WooCommerce aus zu tun (damit keine externen CSV-Dateiberechnungen verwendet werden müssen).
Ich muss wissen, wie viel von jedem Produkt ich bestellen muss (fehlender Lagerbestand). Um dies zu bestimmen, berechne ich mit dem nativen Wert _stock und 2 benutzerdefinierten Feldern:
_missing_stock : Menge des fehlenden Lagerbestands / wie viel Lagerbestand muss ich bestellen
_ref_stock : Referenzbestandsnummer (manuell eingestellt, gewünschte Bestandsmenge im Lager)
also: Fehlender Bestand = Referenzbestand - Bestandswert
Es ist beabsichtigt, den Wert für fehlende Bestände basierend auf dem eingestellten Referenzbestand und dem aktuellen Bestand des Produkts automatisch zu berechnen und zu aktualisieren. Da sich der Produktbestand bei Einkäufen verringert, kann ich schnell sehen, wie viel Bestand jedes Produkts bestellt werden muss.
Basierend auf der regulären Preisberechnung des Produkts basierend auf 2 benutzerdefinierten Feldern im Woocommerce 3-Antwortcode , der einige Ähnlichkeiten aufweist. Ich habe es geschafft, die benutzerdefinierten Felder zu erstellen und bin so weit gekommen.
Ich bin jedoch nicht in der Lage herauszufinden, wie der _missing_stock-Wert automatisch automatisch aktualisiert werden kann.
Dies ist der Code, zu dem ich gekommen bin, natürlich (und wahrscheinlich) nicht ganz korrekt.
// 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 );
}
Vielen Dank im Voraus für die Aufmerksamkeit und den Rat.
Antworten
Der Code, den Sie bereits verwenden und angepasst haben, ist etwas umfangreicher als Ihre Frage. Im Folgenden finden Sie eine vereinfachte Version.
Sie können tatsächlich verwenden, woocommerce_admin_process_product_object
wenn Sie die Anpassung im Backend speichern möchten, um den Wert des benutzerdefinierten Felds zu bestimmen.
Nach einer Bestellung, bei der eine Anpassung des Bestands erfolgt, wird der Wert Ihres benutzerdefinierten Felds jedoch nicht automatisch angepasst.
Dafür können Sie den woocommerce_product_set_stock
Action Hook verwenden.
Dieser Code wurde für "einfache" Produkte geschrieben, kann aber auf Wunsch problemlos auf andere Produkttypen erweitert werden.
Erklärung über Kommentar-Tags, die über im Code hinzugefügt wurden
// 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 );