Campi obbligatori condizionali per WordPress Contact Form 7
So che questo potrebbe essere considerato fuori tema, ma non sono sicuro dove altro pubblicarlo poiché riguarda sia WordPress che il plugin Contact Form 7. Se sapete dove dovrei pubblicarlo invece che qui, vi prego di dirmelo.
Sto cercando di avere un campo condizionalmente obbligatorio. Ho trovato del codice su cui lavorare ma penso di confondermi e ho bisogno di una prospettiva esterna.
Quello che deve funzionare è: se la mia casella di controllo è selezionata su "sì", renderà obbligatorio il menu a tendina accanto ad essa, e se la casella di controllo è selezionata su "no" non sarà obbligatorio.
Questo è quello che ho come form con lo shortcode nel backend:
Hai già ordinato da noi in passato, lavori già con uno dei nostri rappresentanti di vendita esterni?
[checkbox* check-sales id:checksales "Sì" "No"]
Se hai selezionato "Sì" con quale rappresentante tratti solitamente?
[select sales-rep id:sales include_blank "Marla" "Lisa" "Wendy" "Stacy" "Nicole" "Linda" "Jody" "Gisele" "Ray" "Craig"]
[submit]
Ed ecco l'esempio di codice PHP che va nel file functions.php.
// Funzione per verificare se è gmail
function is_gmail($email) {
if(substr($email, -10) == '@gmail.com') {
return true;
} else {
return false;
};
};
// Funzione per il filtro di validazione email personalizzato
function custom_email_validation_filter($result, $tag) {
$type = $tag['type'];
$name = $tag['name'];
if($name == 'your-email') { // Si applica solo ai campi con nome "your-email"
$the_value = $_POST[$name];
if(!is_gmail($the_value)){
$result['valid'] = false;
$result['reason'][$name] = 'Questo non è un indirizzo gmail!'; // Messaggio di errore
};
};
return $result;
};
add_filter('wpcf7_validate_email','custom_email_validation_filter', 10, 2); // Campo email
add_filter('wpcf7_validate_email*', 'custom_email_validation_filter', 10, 2); // Campo email obbligatorio
So che questo è orientato al controllo delle email. Tuttavia, quello su cui mi sto confondendo è cosa devo cambiare per farlo funzionare con una checkbox e un menu a tendina.
Ho trovato una soluzione alternativa che funziona in IE, Chrome e Firefox. Invece di utilizzare l'approccio PHP, ho deciso di sfruttare jQuery. Non è una soluzione completa, ma può essere utile per chiunque abbia bisogno di implementare questa funzionalità.
<script type="text/javascript">
/*! Script jQuery per nascondere determinati campi del form */
$(document).ready(function () {
//Nasconde inizialmente il campo
$("#hide").hide();
//Mostra il campo di testo solo quando viene selezionata la terza opzione
$('#dropdown').change(function () {
if ($("#dropdown").val() == "Other") {
$("#hide").show();
var input = $("#hide");
if (input.length > 0) { //Se il campo di input contiene un valore, lo rimuove
input.val('');
}
} else {
$("#hide").hide();
var input = $("#hide");
input.val("NA"); //Aggiunge il valore NA al campo nascosto che è obbligatorio!
}
});
});
</script>
Questo codice aggiungerà "NA" al campo obbligatorio, bypassando così il controllo di obbligatorietà.

Questa soluzione ha funzionato per me. Nel mio caso, se la checkbox era selezionata, l'indirizzo era obbligatorio.
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, 'L\'indirizzo è obbligatorio.' );
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 );

Ho appena riscontrato questo problema per un progetto e ho scritto un piccolo tutorial su come l'ho risolto. Spero che possa essere utile a qualcuno in futuro:
https://wpharvest.com/contact-form-7-custom-fields-validation/
