Câmpuri obligatorii condiționate pentru Wordpress Contact Form 7
Știu că acest subiect ar putea fi considerat off-topic, dar nu sunt sigur unde altundeva să postez această întrebare, deoarece se referă atât la WordPress, cât și la plugin-ul Contact Form 7. Dacă știți unde ar trebui să postez acest lucru în altă parte, vă rog să-mi spuneți.
Încerc să creez un câmp obligatoriu condiționat. Am găsit cod care să funcționeze, dar cred că mă confuz singur și am nevoie de o perspectivă din exterior.
Ceea ce trebuie să funcționeze este următorul lucru: dacă checkbox-ul meu este bifat pe "da", va face ca lista derulantă de lângă el să fie obligatorie, iar dacă checkbox-ul este bifat pe "nu", aceasta nu va fi obligatorie.
Acesta este formularul meu cu shortcode-ul din backend:
Dacă ați comandat de la noi în trecut, lucrați deja cu unul dintre reprezentanții noștri de vânzări?
[checkbox* check-sales id:checksales "Da" "Nu"]
Dacă ați bifat "Da", cu care reprezentant colaborați de obicei?
[select sales-rep id:sales include_blank "Marla" "Lisa" "Wendy" "Stacy" "Nicole" "Linda" "Jody" "Gisele" "Ray" "Craig"]
[submit]
Și aici este exemplul de cod PHP care merge în fișierul functions.php.
function is_gmail($email) {
if(substr($email, -10) == '@gmail.com') {
return true;
} else {
return false;
};
};
function custom_email_validation_filter($result, $tag) {
$type = $tag['type'];
$name = $tag['name'];
if($name == 'your-email') { // Se aplică doar câmpurilor cu numele "your-email"
$the_value = $_POST[$name];
if(!is_gmail($the_value)){
$result['valid'] = false;
$result['reason'][$name] = 'Aceasta nu este o adresă gmail!'; // Mesaj de eroare
};
};
return $result;
};
add_filter('wpcf7_validate_email','custom_email_validation_filter', 10, 2); // Câmp email
add_filter('wpcf7_validate_email*', 'custom_email_validation_filter', 10, 2); // Câmp email obligatoriu
Știu că acest cod este orientat spre verificarea email-urilor. Cu toate acestea, ceea ce mă confuză este ce trebuie să schimb pentru a face acest lucru să funcționeze pentru un checkbox și o listă derulantă.

Am găsit o soluție pentru această problemă care funcționează în IE, Chrome și Firefox. Și în loc să folosesc o abordare PHP, am decis să utilizez jQuery. Nu este o soluție completă, dar poate fi utilă pentru oricine altcineva care are nevoie să aplice acest lucru.
<script type="text/javascript">
/*! jQuery script pentru a ascunde anumite câmpuri de formular */
$(document).ready(function () {
//Ascunde câmpul inițial
$("#hide").hide();
//Arată câmpul de text doar când este selectată a treia opțiune
$('#dropdown').change(function () {
if ($("#dropdown").val() == "Other") {
$("#hide").show();
var input = $("#hide");
if (input.length > 0) { //Dacă câmpul de intrare conține vreo valoare, o elimină
input.val('');
}
} else {
$("#hide").hide();
var input = $("#hide");
input.val("NA"); //Adaugă valoarea NA în câmpul ascuns care este obligatoriu!
}
});
});
</script>
Aceasta va adăuga NA în câmpul obligatoriu, ocolind astfel verificarea de obligatorietate.

Această soluție a funcționat pentru mine. În cazul meu, dacă checkbox-ul era bifat, adresa era obligatorie.
function my_custom_conditional_required($result, $tag) {
$tag = new WPCF7_Shortcode( $tag );
$name = $tag->name;
$value = isset( $_POST[$name] )
? trim( wp_unslash( strtr( (string) $_POST[$name], "\n", " " ) ) )
: '';
$myCheckbox= $_POST['myCheckbox'][0];
if( $name == "address" && $myCheckbox== true){
if ( '' == $value ) :
$result->invalidate( $tag, 'Adresa este obligatorie.' );
endif;
}
return $result;
}
add_filter( 'wpcf7_validate_text', 'my_custom_conditional_required', 10, 2 );
add_filter( 'wpcf7_validate_text*', 'my_custom_conditional_required', 10, 2 );

Tocmai am întâlnit această problemă pentru un proiect și am decis să scriu un mic tutorial despre cum am rezolvat-o. Sper să fie de ajutor pentru cineva în viitor:
https://wpharvest.com/contact-form-7-custom-fields-validation/
