Calcul du champ de stock personnalisé basé sur la valeur actuelle du stock du produit WooCommerce

Nov 29 2020

Je fais un effort pour améliorer ma gestion de l'inventaire et le faire directement à partir de WooCommerce (pour qu'il ne soit pas nécessaire d'utiliser des calculs de fichiers CSV externes)

J'ai besoin de savoir quelle quantité de chaque produit je dois commander (stock manquant). Pour déterminer cela, je calcule en utilisant la valeur native _stock et 2 champs personnalisés:

_missing_stock : quantité de stock manquant / quantité de stock dont j'ai besoin pour commander

_ref_stock : numéro de stock de référence (défini manuellement, quantité de stock souhaitée dans l'entrepôt)

donc: Stock manquant = Stock de référence - Valeur du stock


L'intention est de calculer et de mettre à jour automatiquement la valeur du stock manquant en fonction du stock de référence qui a été défini et du stock actuel du produit. Au fur et à mesure que le stock de produits diminue avec les achats, je suis rapidement en mesure de voir la quantité de stock de chaque produit à commander.

Basé sur le calcul du prix régulier du produit basé sur 2 champs personnalisés dans le code de réponse Woocommerce 3 qui présente quelques similitudes, j'ai réussi à créer les champs personnalisés et à arriver jusqu'à présent.

Cependant, je ne suis pas en mesure de comprendre comment enfin mettre à jour automatiquement la valeur _missing_stock automatiquement.

C'est le code que j'ai réussi à trouver, naturellement (et probablement) pas tout à fait correct.

// 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 );
}

Merci d'avance pour l'attention et les conseils.

Réponses

1 7uc1f3r Nov 29 2020 at 22:26

Le code que vous utilisez déjà et que vous avez adapté est légèrement plus complet que votre question, voici donc une version simplifiée.

Vous pouvez en effet utiliser woocommerce_admin_process_product_objectlorsque vous allez enregistrer l'ajustement dans le backend pour déterminer la valeur du champ personnalisé.

Cependant, après une commande lorsqu'un ajustement du stock a lieu, la valeur de votre champ personnalisé ne s'ajustera pas automatiquement.

Pour cela, vous pouvez utiliser le woocommerce_product_set_stockcrochet d'action.

Ce code est écrit pour des produits «simples» mais peut facilement être étendu à d'autres types de produits si vous le souhaitez.

Explication via des balises de commentaire ajoutées via dans le code

// 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 );