Skip to content

Commit b0ab07e

Browse files
authored
gpr-randomize-fields-to-its-own-page.php: Added snippet to randomize fields to its own page.
1 parent ec6b24f commit b0ab07e

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
/**
3+
* Gravity Perks // Randomizer // Randomize Fields to Its Own Page
4+
* https://gravitywiz.com/documentation/gravity-forms-randomizer/
5+
*
6+
* Use this snippet to randomize fields within their respective pages.
7+
*
8+
* See video: https://www.loom.com/share/2dd4f3c6995349ae91d4b88f3990294b
9+
*/
10+
add_filter( 'gpr_filtered_fields', function( $filtered_fields, $form ) {
11+
12+
$feed_id = gp_randomizer()->get_default_feed_id( $form['id'] );
13+
$settings = rgar( gp_randomizer()->get_feed( $feed_id ), 'meta', array() );
14+
15+
if ( ! $settings['display_count'] ) {
16+
$filtered_fields = randomize_fields_within_pages( $form['fields'] );
17+
} else {
18+
$filtered_fields = arrange_fields_by_page( $form['fields'], $filtered_fields );
19+
}
20+
return $filtered_fields;
21+
}, 10, 2 );
22+
23+
function arrange_fields_by_page( $fields_backup, $filtered_fields ) {
24+
$filtered_map = array();
25+
foreach ( $filtered_fields as $field ) {
26+
$filtered_map[ $field->id ] = $field;
27+
}
28+
29+
$result = array();
30+
$used_ids = array();
31+
32+
foreach ( $fields_backup as $field ) {
33+
if ( $field->type === 'page' ) {
34+
$result[] = $field;
35+
} elseif ( isset( $filtered_map[ $field->id ] ) ) {
36+
$result[] = $filtered_map[ $field->id ];
37+
38+
$used_ids[] = $field->id;
39+
}
40+
}
41+
42+
foreach ( $filtered_fields as $field ) {
43+
if ( ! in_array( $field->id, $used_ids, true ) && $field->type !== 'page' ) {
44+
$result[] = $field;
45+
}
46+
}
47+
48+
// Clean up redundant pages
49+
$cleaned_result = array();
50+
$prev_is_page = false;
51+
52+
foreach ( $result as $field ) {
53+
if ( $field->type === 'page' ) {
54+
if ( $prev_is_page ) {
55+
continue; // Skip consecutive page
56+
}
57+
$prev_is_page = true;
58+
} else {
59+
$prev_is_page = false;
60+
}
61+
$cleaned_result[] = $field;
62+
}
63+
64+
// Remove leading page
65+
if ( isset( $cleaned_result[0] ) && $cleaned_result[0]->type === 'page' ) {
66+
array_shift( $cleaned_result );
67+
}
68+
69+
// Remove trailing page
70+
if ( ! empty( $cleaned_result ) && end( $cleaned_result )->type === 'page' ) {
71+
array_pop( $cleaned_result );
72+
}
73+
74+
return $cleaned_result;
75+
}
76+
77+
function randomize_fields_within_pages( $fields ) {
78+
$result = array();
79+
$current_group = array();
80+
81+
foreach ( $fields as $field ) {
82+
if ( $field->type === 'page' ) {
83+
// Shuffle current group and add to result.
84+
shuffle( $current_group );
85+
$result = array_merge( $result, $current_group );
86+
$result[] = $field; // Add the page marker.
87+
$current_group = array(); // Start new group.
88+
} else {
89+
$current_group[] = $field;
90+
}
91+
}
92+
93+
// Add any remaining fields in the last group.
94+
if ( ! empty( $current_group ) ) {
95+
shuffle( $current_group );
96+
$result = array_merge( $result, $current_group );
97+
}
98+
99+
return $result;
100+
}

0 commit comments

Comments
 (0)