Search code examples
woocommercehook-woocommercewoocommerce-rest-apiwoocommerce-theming

WooCommerce function that disables an admin user to reduce the product stock quantity


I would like to add a function that is triggered every time that the stock quantity of a product will be changed in the admin product page, such that this function will not allow any reduce of the stock value - but only increase. This is to prevent an admin user to reduce the stock quantity of the products. Of course, this function should not be triggered if a product will be in an order, since then of course I would like the stock quantity to be reduced.

I tried the following function in the functions.php but unfortunately did not work. Since I'm new to woocommerce and php, any ideas that could provide a solid solution to the problem?

// get old and new product stock quantity
function get_old_and_new_product_quantity_stock( $sql, $product_id_with_stock, $new_stock, $operation ) {

    $product            = wc_get_product( $product_id_with_stock );
    $old_stock_quantity = $product->get_stock_quantity();
    $new_stock_quantity = $new_stock;
    echo $old_stock_quantity, $new_stock_quantity;
    
    if ($new_stock_quantity < $old_stock_quantity) {
        $new_stock = $old_stock_quantity;
        $new_stock_quantity = $old_stock_quantity;

    }

    return $sql;

}
add_filter( 'woocommerce_update_product_stock_query', 'get_old_and_new_product_quantity_stock', 10, 4 );

Solution

  • You can use the update_post_meta action hook to check if the new value is less than the previous value and display error message. This will work for quick edit and for product edit page. But the wp_die on product page will look bad so use the javascript to prevent submitting on product edit page (there was another question about it yesterday) Be sure to test this snippet and create some orders that will reduce the stock automatically. I added is_admin() check but please do a good test.

    
    add_action( 'update_post_meta', 'prevent_reducing_stock_metadata', 10, 4 );
    function prevent_reducing_stock_metadata( $meta_id, $post_id, $meta_key, $meta_value ) {
        // Check if the meta key is _stock and the new value is less than the previous value
        if ( '_stock' == $meta_key && $meta_value < get_post_meta( $post_id, '_stock', true ) ) {
            // Check if this is an update from the WordPress admin area
            if ( is_admin() ) {
                wp_die( __( 'Error: You cannot reduce the stock level for this product.' ), 'error' );
            }
        }
    }