Site icon WP Smith

How to Pre-Populate A Radio/Select Field in Gravity Forms Based on Previous Inputs

So recently someone asked me, "Can Gravity Forms pre-populate a dropdown [radio or select] with information based on a previous input in a multipage form?" While the options are plenty to make this happen with the very many Gravity Form hooks. Some include the following (but not limited to):

While both of these are extremely viable options, what this person wanted was to search a custom post type for someone's name. So on page 1 of the form was an input for the person's name.

While logically, one would think that the gform_field_value_$parameter_name filter would work, I couldn't for the life of me determine how to do this for select and/or radio fields. So, I switched back to gform_pre_render hook. As you may or may not know gform_pre_render hook gives you the $form object to manipulate prior to rendering the form and executed before the form is displayed, which is what I needed.

Setup

In order to set this up, you will need two things:

  1. A custom post type called 'Persons' (wps_person), which served as the body of data that would pre-populate the radios.
  2. A simple Multipaged form

Gravity Forms Multi-paged Form

So create a new gravity form. Add a name (Field ID:1), then add a radio field. In the name field select either Normal (this is what the example uses) or Simple (example has a commented out replacement for this). Have the name on page 1 and the radio options on page 2. In the radio field, do the following under the Advanced Tab:

Now you are ready...

Gravity Forms Customization

First, we have to cycle through the form fields. Gravity Forms does not prepped the Form Object (here $form) where the key is the Field ID (though that would be nice).

Next, in this snippet, you will notice a check at the beginning to see if we are on the correct field. You may think I go overboard, but I don't want to edit the wrong field. So I am checking for the following:

[php]
if ( 'radio' != $field['type'] || false === strpos( $field['cssClass'], 'candle-person' ) || ! rgar( $field, 'allowsPrepopulate' ) )
[/php]

While you don't necessarily need all three per se, I find that I don't run into errors when I do all three.

Third, we do a new WP_Query() (see codex for more information & see Mark Luetke's (Github, Site) WP_Query Args Gist) searching for those items that match the name. Here I access the $_POST var with the appropriate input_*_* name. I then also tell it to query my post type ('wps_person'). For future possibilities, I add another query var 'gform_search', just in case I want to do something with pre_get_posts later, but that's for more advanced usage.

Then, I just cycle through the available posts to create my choices, and return the form.

Here's an example: