Randomize Fields to Its Own Page

Use this snippet to randomize fields within their respective pages.

See video: https://www.loom.com/share/2dd4f3c6995349ae91d4b88f3990294b

Code

Filename: gpr-randomize-fields-to-its-own-page.php

<?php
/**
 * Gravity Perks // Randomizer // Randomize Fields to Its Own Page
 * https://gravitywiz.com/documentation/gravity-forms-randomizer/
 *
 * Use this snippet to randomize fields within their respective pages.
 *
 * See video: https://www.loom.com/share/2dd4f3c6995349ae91d4b88f3990294b
 */
add_filter( 'gpr_filtered_fields', function( $filtered_fields, $form ) {

	$feed_id = gp_randomizer()->get_default_feed_id( $form['id'] );
	$settings = rgar( gp_randomizer()->get_feed( $feed_id ), 'meta', array() );

	if ( ! $settings['display_count'] ) {
		$filtered_fields = randomize_fields_within_pages( $form['fields'] );
	} else {
		$filtered_fields = arrange_fields_by_page( $form['fields'], $filtered_fields );
	}
	return $filtered_fields;
}, 10, 2 );

function arrange_fields_by_page( $fields_backup, $filtered_fields ) {
	$filtered_map = array();
	foreach ( $filtered_fields as $field ) {
		$filtered_map[ $field->id ] = $field;
	}

	$result   = array();
	$used_ids = array();

	foreach ( $fields_backup as $field ) {
		if ( $field->type === 'page' ) {
			$result[] = $field;
		} elseif ( isset( $filtered_map[ $field->id ] ) ) {
			$result[] = $filtered_map[ $field->id ];

			$used_ids[] = $field->id;
		}
	}

	foreach ( $filtered_fields as $field ) {
		if ( ! in_array( $field->id, $used_ids, true ) && $field->type !== 'page' ) {
			$result[] = $field;
		}
	}

	// Clean up redundant pages
	$cleaned_result = array();
	$prev_is_page   = false;

	foreach ( $result as $field ) {
		if ( $field->type === 'page' ) {
			if ( $prev_is_page ) {
				continue; // Skip consecutive page
			}
			$prev_is_page = true;
		} else {
			$prev_is_page = false;
		}
		$cleaned_result[] = $field;
	}

	// Remove leading page
	if ( isset( $cleaned_result[0] ) && $cleaned_result[0]->type === 'page' ) {
		array_shift( $cleaned_result );
	}

	// Remove trailing page
	if ( ! empty( $cleaned_result ) && end( $cleaned_result )->type === 'page' ) {
		array_pop( $cleaned_result );
	}

	return $cleaned_result;
}

function randomize_fields_within_pages( $fields ) {
	$result        = array();
	$current_group = array();

	foreach ( $fields as $field ) {
		if ( $field->type === 'page' ) {
			// Shuffle current group and add to result.
			shuffle( $current_group );
			$result        = array_merge( $result, $current_group );
			$result[]      = $field; // Add the page marker.
			$current_group = array(); // Start new group.
		} else {
			$current_group[] = $field;
		}
	}

	// Add any remaining fields in the last group.
	if ( ! empty( $current_group ) ) {
		shuffle( $current_group );
		$result = array_merge( $result, $current_group );
	}

	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.