Set a Minimum Order Quantity

Read the Walkthrough

Code

Filename: gw-minimum-order-qty.php

<?php
/**
 * Gravity Wiz // Gravity Forms // Set a Minimum Order Quantity
 * https://gravitywiz.com/set-a-minimum-order-quantity/
 */
add_filter('gform_validation_123', function( $result ) {

	$result = gw_validate_minimum_quantity( $result, array(
		'min_qty'         => 20,
		'min_qty_message' => 'Customized messaged for this group.',
		'min_qty_fields'  => array( 1, 2, 3 ),
	) );

	$result = gw_validate_minimum_quantity( $result, array(
		'min_qty'        => 15,
		'min_qty_fields' => array( 4, 5, 6 ),
	) );

	return $result;
} );

function gw_validate_minimum_quantity( $result, $args = array() ) {

	$args = wp_parse_args( $args, array(
		'min_qty'               => 1,
		'min_qty_message'       => 'You must order a minimum of %1$d tickets. Order %2$d more tickets to complete your order.',
		'min_qty_fields'        => array(),
		'validate_empty_fields' => false,
	) );

	$min_qty         = $args['min_qty'];
	$min_qty_message = $args['min_qty_message'];
	$min_qty_fields  = $args['min_qty_fields'];

	/* no need to edit below this line */

	$form              = $result['form'];
	$quantity          = 0;
	$qty_fields        = array();
	$has_entered_value = false;

	foreach ( $form['fields'] as &$field ) {

		// if $min_qty_fields specified, make sure only applicable quantity fields are totaled
		if ( ! empty( $min_qty_fields ) && ! in_array( $field['id'], $min_qty_fields ) ) {
			continue;
		}

		if ( in_array( RGFormsModel::get_input_type( $field ), array( 'singleproduct', 'calculation' ) ) ) {

			// check if product field has separate quantity field, if so skip
			if ( sizeof( GFCommon::get_product_fields_by_type( $form, array( 'quantity' ), $field['id'] ) ) > 0 ) {
				continue;
			}

			$value = rgpost( "input_{$field['id']}_3" );
			if ( ! rgblank( $value ) ) {
				$has_entered_value = true;
			}

			$quantity    += floatval( GFCommon::clean_number( $value ) );
			$qty_fields[] =& $field;

		} elseif ( $field['type'] == 'quantity' ) {

			$value = rgpost( "input_{$field['id']}" );
			if ( ! rgblank( $value ) ) {
				$has_entered_value = true;
			}

			$quantity += floatval( GFCommon::clean_number( $value ) );
			if ( ! rgblank( $value ) || $args['validate_empty_fields'] ) {
				$qty_fields[] =& $field;
			}
		}
	}

	if ( ! $has_entered_value || $quantity >= $min_qty ) {
		return $result;
	}

	for ( $i = 0; $i < count( $qty_fields ); $i++ ) {
		$qty_fields[ $i ]['failed_validation']  = true;
		$qty_fields[ $i ]['validation_message'] = sprintf( $min_qty_message, $min_qty, $min_qty - $quantity );
	}

	$result['is_valid'] = false;
	$result['form']     = $form;

	return $result;
}

Leave a Reply

Your email address will not be published. Required fields are marked *

  • Trouble installing this snippet? See our troubleshooting tips.
  • Need to include code? Create a gist and link to it in your comment.
  • Reporting a bug? Provide a URL where this issue can be recreated.

By commenting, I understand that I may receive emails related to Gravity Wiz and can unsubscribe at any time.