Skip to content

Instantly share code, notes, and snippets.

@codearachnid
Last active November 10, 2023 10:46
Show Gist options
  • Star 26 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save codearachnid/a06e13be7f01b81b838c to your computer and use it in GitHub Desktop.
Save codearachnid/a06e13be7f01b81b838c to your computer and use it in GitHub Desktop.
Add the optgroup ability to Gravity Forms default select field.
/**
* Filter Gravity Forms select field display to wrap optgroups where defined
* USE:
* set the value of the select option to `optgroup` within the form editor. The
* filter will then automagically wrap the options following until the start of
* the next option group
*/
add_filter( 'gform_field_content', 'filter_gf_select_optgroup', 10, 2 );
function filter_gf_select_optgroup( $input, $field ) {
if ( $field->type == 'select' ) {
$opt_placeholder_regex = strpos($input,'gf_placeholder') === false ? '' : "<\s*?option.*?class='gf_placeholder'>[^<>]+<\/option\b[^>]*>";
$opt_regex = "/<\s*?select\b[^>]*>" . $opt_placeholder_regex . "(.*?)<\/select\b[^>]*>/i";
$opt_group_regex = "/<\s*?option\s*?value='optgroup\b[^>]*>([^<>]+)<\/option\b[^>]*>/i";
preg_match($opt_regex, $input, $opt_values);
$split_options = preg_split($opt_group_regex, $opt_values[1]);
$optgroup_found = count($split_options) > 1;
// sometimes first item in the split is blank
if( strlen($split_options[0]) < 1 ){
unset($split_options[0]);
$split_options = array_values( $split_options );
}
if( $optgroup_found ){
$fixed_options = '';
preg_match_all($opt_group_regex, $opt_values[1], $opt_group_match);
if( count($opt_group_match) > 1 ){
foreach( $split_options as $index => $option ){
$fixed_options .= "<optgroup label='" . $opt_group_match[1][$index] . "'>" . $option . '</optgroup>';
}
}
$input = str_replace($opt_values[1], $fixed_options, $input);
}
}
return $input;
}
@ztobs
Copy link

ztobs commented May 24, 2019

I just ran into this today and found it quite useful. I noticed that it didn't seem to support ungrouped options at the beginning so I took a stab at my own version: https://gist.github.com/aaemnnosttv/72d0d34fad21d3f906ac9f3bdd61bd50

Yes, it messes things up when 1st option isnt grp option

@KZeni
Copy link

KZeni commented Sep 11, 2019

I'm using the update proposed by @aaemnnosttv per https://gist.github.com/codearachnid/a06e13be7f01b81b838c#gistcomment-2724704 pointing out the important fact that ungrouped options at the start break things as this code is.

@MrFent
Copy link

MrFent commented Jun 14, 2023

Exactly what I was looking for. Brilliant! Thank you much.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment