Hi there,
We have a post type ("yourstories") which has a CRED form for visitors to submit their stories.
Sometimes visitors will submit the stories from the front end, in which case we require some additional fields to be completed (email, telephone, location, etc).
Sometimes site admins create these stories on the backend of the site itself. In these cases, those fields are not required.
But if I make those fields required in Types, then they are required regardless of whether the story is being added by a site visitor form the front end, or an admin on the back.
So my question: is there any way to make it so that fields are required when the post is created from the front, but not required when created in the backend by an admin (in wp-admin)?
Many thanks and best wishes,
Andrew.
Hi, you can use the cred_form_validate hook to enforce any requirements on a CRED form, and these requirements will not be applied when editing the same post in wp-admin. These requirements are enforced on the back-end, meaning that the form must be submitted before the validation is performed. Then the error messages will appear in the form if necessary. Here's an example:
add_filter( 'cred_form_validate', 'custom_story_validation', 10, 2 );
function custom_story_validation( $data, $form_data ) {
$forms = array( 123, 456 );
if( in_array( $form_data['id'], $forms ) ){
list($fields,$errors)=$data;
if (empty($fields['wpcf-email'])) {
$errors['email'] = __('Email address is required', 'your-language-domain');
}
if (empty($fields['wpcf-telephone'])) {
$errors['telephone'] = __('Telephone is required', 'your-language-domain');
}
if (empty($fields['wpcf-location'])) {
$errors['location'] = __('Location is required', 'your-language-domain');
}
$data =array($fields,$errors);
}
return $data;
}
Change 123, 456 to be the ID of the CRED form, or a comma-separated list of form IDs. Then you may need to adjust the field slugs and error slugs to match your custom field names.
Thanks Christian.
When you say: "These requirements are enforced on the back-end, meaning that the form must be submitted before the validation is performed. Then the error messages will appear in the form if necessary. "
...how does this work out? If a visitor submits the form without required fields, how are they informed?
Many thanks,
Andrew.
...how does this work out? If a visitor submits the form without required fields, how are they informed?
The error messages will appear in your CRED form wherever you place the form_messages field shortcode.
[cred_field field='form_messages' value='' class='alert alert-warning']
If errors are found when the form is submitted, the Story post will not be created or edited. The form will be displayed again with the error messages.
Thank you,
Will that happen immediately they submit...so they would be aware on the screen that appears after submission, and they'd be told what needed to be corrected?
Correct, the error messages will be displayed on the page after they submit the form.
Hi Christian,
Where do I get error slugs from?
Hi Christian,
I have removed the Required checkbox from each filed, completed the code in functions.php that you advised, and then tried submitting the form from the front end without completing the required fields...but the form submits without error messages 🙁
Hope you can help.
Note that I don't know what I should put in the code at each point where it says $errors[' ']. I've madeup slugs there as I don't know what to use. Could this be the issue?
add_filter( 'cred_form_validate', 'custom_story_validation', 10, 2 );
function custom_story_validation( $data, $form_data ) {
$forms = array( 43206 );
if( in_array( $form_data['id'], $forms ) ){
list($fields,$errors)=$data;
if (empty($fields['ecpt_field_yourstory_name'])) {
$errors['nameerror'] = __('This field is required.', 'your-language-domain');
}
if (empty($fields['ecpt_field_yourstory_info'])) {
$errors['infoerror'] = __('This field is required.', 'your-language-domain');
}
if (empty($fields['yourstory-new-email'])) {
$errors['emailerror'] = __('This field is required.', 'your-language-domain');
}
if (empty($fields['yourstory-new-telephone'])) {
$errors['telephoneerror'] = __('This field is required.', 'your-language-domain');
}
if (empty($fields['yourstory-new-year-of-birth'])) {
$errors['yearbirtherror'] = __('This field is required.', 'your-language-domain');
}
if (empty($fields['yourstory-new-place-of-birth'])) {
$errors['placebirtherror'] = __('This field is required.', 'your-language-domain');
}
if (empty($fields['yourstory-new-place-currently-living'])) {
$errors['livingerror'] = __('This field is required.', 'your-language-domain');
}
if (empty($fields['yourstory-new-current-occupation'])) {
$errors['occupationerror'] = __('This field is required.', 'your-language-domain');
}
if (empty($fields['yourstory-new-time-period'])) {
$errors['perioderror'] = __('This field is required.', 'your-language-domain');
}
if (empty($fields['yourstory-new-copyright-agreement'])) {
$errors['copyrighterror'] = __('This field is required.', 'your-language-domain');
}
$data =array($fields,$errors);
}
return $data;
}
Check the example I showed above as a reference:
https://toolset.com/forums/topic/required-fields-3/#post-786594
The field slugs in the $fields array should be defined depending on the type of custom field. If the field is a custom field created in Types, then the slug is "wpcf-" plus the slug of the custom field from wp-admin. So if your field was created in Types, and has the slug 'placebirth' in wp-admin, then the field slug in the $fields array code should be 'wpcf-placebirth'. If the fields are generic fields, then you can eliminate the 'wpcf-' prefix.
The slugs in the $errors array should not use the 'wpcf-' prefix, but should otherwise match the slug in the $fields array.