Ask for one of several fields instead of all of them — “leave us an email or a phone number, you don’t need both.”
Fluent Forms cannot express this on its own. Its Required setting is per field, so marking both Email and Phone required forces the visitor to fill in both; leaving both optional means you may get neither. Min/Max Selection only counts options inside one field. A required field group closes the gap: tag two or more fields with the same group name and the form requires at least one of them.
Use Cases
- Contact details – Email or phone, whichever the visitor prefers to share.
- Job applications – Attach a CV or paste a portfolio URL.
- Company identification – VAT number or company registration number, depending on the country.
- “Tell us at least two things” – Set the minimum to 2 or more when you need several answers out of a longer list.
How to Use
No plugin setting to switch on — the three controls are on every input field that Fluent Forms can mark required.
- Open your form in Fluent Forms → Editor
- Click the first field you want in the group and open Input Customization → Advanced Options
- In Required Field Group, type a name for the group — anything you like, for example
contact - Repeat on the other fields, typing the same name
- Save the form
That is it. The form now asks for at least one of them, and each member’s label gets a ** marker so visitors can see the two fields belong together.
Settings
| Setting | What it does |
|---|---|
| Required Field Group | The group name. Fields sharing a name form one group. Leave blank to take the field out of any group. |
| Minimum Filled Fields | How many members must be filled in. Defaults to 1. |
| Required Field Group Message | Your own error message. Leave blank for an automatic one that lists the group’s fields. |
Group names are matched loosely: Contact, contact and contact are the same group, so a stray capital or trailing space will not silently split it in two.
The first field wins
Minimum Filled Fields and Required Field Group Message are read from whichever member sits first in the form; the same settings on the other members are ignored. This only matters if you set conflicting values on different members — and note that reordering the fields then changes which one applies.
Key Features
The Message Says What Is Needed
When the group is not satisfied, one error appears on the first empty member:
Please fill in at least one of these fields: Email, Phone.
With a minimum of 2 it reads “at least 2 of these fields”. Only the fields the visitor can actually see are listed. Set Required Field Group Message if you would rather write it yourself.
Works With Every Field Type
The group delegates to Fluent Forms’ own Required rule, so it understands each field type the same way Fluent Forms does — including file uploads, so “attach a CV or paste a portfolio URL” is satisfied by uploading the file.
Fields whose inputs are numbered per row or per column cannot be group members, because “is this field empty?” has no single answer for them: Repeat Field, Repeater Field, Container Repeater, Tabular Grid and Chained Select. Fields that Fluent Forms itself cannot mark required — hidden fields, HTML blocks, section breaks, captchas, buttons — are not group members either, and the settings do not appear on them.
Conditional Logic Is Respected
A member hidden by conditional logic is not counted and never flagged. If every member of a group is hidden, the group is satisfied and the form submits — a group can never trap a visitor in a form they cannot send.
A group with fewer than two visible members does nothing at all. A typo in one of the names therefore means “no rule ran”, never “this field is mysteriously required now”.
Checked Before and After Submit
The rule runs in the browser for immediate feedback and again on the server, which is authoritative. Turning JavaScript off, or scripting the endpoint directly, does not get past it.
The ** Marker
No member of a group is individually required, so Fluent Forms renders no asterisk for any of them — which would leave the visitor looking at fields that appear entirely optional. Each member’s label therefore carries a ** marker (Fluent Forms’ own “required” colour) and the CSS class fe-el-is-group-required.
Change the text with a filter:
// Use a different marker everywhere.
add_filter('formenhancer/required_field_group_marker', function () {
return '(1 of 2)';
});
// No marker at all on form 42.
add_filter('formenhancer/required_field_group_marker', function ($marker, $form) {
return 42 === (int) $form->id ? '' : $marker;
}, 10, 2);
Or restyle it in your theme’s CSS:
/* Move it in front of the label instead, in your own colour. */
.fluentform .ff-el-input--label.fe-el-is-group-required label:after {
content: none;
}
.fluentform .ff-el-input--label.fe-el-is-group-required label:before {
content: "◆ ";
color: #6b7280;
}
The marker is deliberately not exposed to screen readers as aria-required. A group member can legitimately be left blank, so announcing it as required would be wrong; when the group does fail, Fluent Forms’ own aria-invalid and role="alert" handling applies as usual.
Limitations
- Groups spanning multiple steps are checked on submit, not while stepping through the form. Fluent Forms validates one step at a time when you press Next, so a browser-side rule would block step 1 for a field the visitor cannot reach yet. The server still rejects the submission and Fluent Forms returns the visitor to the step holding the problem.
- Conversational Forms render through a separate application with its own validation, which the browser-side rule cannot reach. The server-side check still applies, so the error surfaces at the end of the conversation rather than on the offending question.
- A member that is also individually required keeps its own Required setting — the group only ever adds a requirement, it never removes one. In practice that makes the group permanently satisfied, since the required member has to be filled in anyway. It is almost always a mistake; if you meant “one of these”, take the individual Required setting off.
Turning It Off
There is no settings toggle. Use the filter:
// Disable globally.
add_filter('formenhancer/required_field_groups', '__return_false');
// Disable for a specific form.
add_filter('formenhancer/required_field_groups', function ($enabled, $form) {
return 42 === (int) $form->id ? false : $enabled;
}, 10, 2);
This switches off both the browser-side and the server-side check, and removes the three settings from the form editor.
Notes
- Works with Fluent Forms free and Pro. Fluent Forms Pro fields (Phone, Ranking, Net Promoter Score, Range Slider, Post Selection, Colour Picker, Rich Text) can be group members, as can Form Enhancer’s own fields.
- Nothing to migrate. Forms saved before this feature open with the new settings present and empty; no database update runs.
- Existing settings are untouched. The group is stored per field alongside Fluent Forms’ own settings and travels with form exports and imports.
Table of Contents