add_action( 'woocommerce_product_after_variable_attributes', 'cwpai_woo_variation_settings_fields', 10, 3 ); function cwpai_woo_variation_settings_fields( $loop, $variation_data, $variation ) { $min_qty = get_post_meta( $variation->ID, 'min_qty', true ); $max_qty = get_post_meta( $variation->ID, 'max_qty', true ); ?> <div> <p class="form-row form-row-first"> <label><?php esc_html_e( 'Minimum Quantity', 'cwpai' ); ?></label> <input type="number" class="short" size="5" name="min_qty[<?php echo $loop; ?>]" value="<?php echo esc_attr( $min_qty ); ?>" /> </p> <p class="form-row form-row-last"> <label><?php esc_html_e( 'Maximum Quantity', 'cwpai' ); ?></label> <input type="number" class="short" size="5" name="max_qty[<?php echo $loop; ?>]" value="<?php echo esc_attr( $max_qty ); ?>" /> </p> </div> <?php } add_action( 'woocommerce_save_product_variation', 'cwpai_woo_save_variation_settings_fields', 10, 2 ); function cwpai_woo_save_variation_settings_fields( $variation_id, $i ) { $min_qty = $_POST['min_qty'][$i]; $max_qty = $_POST['max_qty'][$i]; if ( isset( $min_qty ) ) { update_post_meta( $variation_id, 'min_qty', esc_attr( $min_qty ) ); } if ( isset( $max_qty ) ) { update_post_meta( $variation_id, 'max_qty', esc_attr( $max_qty ) ); } } add_filter( 'woocommerce_add_to_cart_validation', 'cwpai_woo_validate_min_max_quantity', 10, 5 ); function cwpai_woo_validate_min_max_quantity( $passed, $product_id, $quantity, $variation_id = '', $variations = '' ) { if ( $variation_id ) { $min_qty = get_post_meta( $variation_id, 'min_qty', true ); $max_qty = get_post_meta( $variation_id, 'max_qty', true ); if ( $min_qty && $quantity < $min_qty ) { wc_add_notice( sprintf( __( 'You must add at least %s of this product to your cart.', 'cwpai' ), $min_qty ), 'error' ); $passed = false; } if ( $max_qty && $quantity > $max_qty ) { wc_add_notice( sprintf( __( 'You can add a maximum of %s of this product to your cart.', 'cwpai' ), $max_qty ), 'error' ); $passed = false; } } return $passed; }