Campos requeridos condicionales para WordPress Contact Form 7
Sé que esto podría considerarse fuera de tema, pero no estoy seguro de dónde más publicarlo ya que también se relaciona tanto con WordPress como con el plugin Contact Form 7. Si sabes dónde debería publicar esto además de aquí, por favor dímelo.
Estoy buscando tener un campo requerido condicionalmente. He encontrado código que funciona pero creo que me estoy confundiendo y necesito una perspectiva externa.
Lo que necesito que funcione es que si mi casilla de verificación está marcada como "sí", hará que el menú desplegable junto a ella sea obligatorio, y si la casilla está marcada como "no", no será obligatorio.
Esto es lo que tengo como formulario con el shortcode en el backend:
Si has pedido con nosotros antes, ¿ya trabajas con uno de nuestros representantes de ventas externos?
[checkbox* check-sales id:checksales "Sí" "No"]
Si marcaste "Sí", ¿con qué representante tratas generalmente?
[select sales-rep id:sales include_blank "Marla" "Lisa" "Wendy" "Stacy" "Nicole" "Linda" "Jody" "Gisele" "Ray" "Craig"]
[submit]
Y aquí está el ejemplo de código PHP que va en el archivo functions.php.
function is_gmail($email) {
// Comprobar si es una dirección de gmail
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') { // Solo se aplica a campos con el nombre de campo de formulario "your-email"
$the_value = $_POST[$name];
if(!is_gmail($the_value)){
$result['valid'] = false;
$result['reason'][$name] = '¡Esta no es una dirección de gmail!'; // Mensaje de error
};
};
return $result;
};
add_filter('wpcf7_validate_email','custom_email_validation_filter', 10, 2); // Campo de email
add_filter('wpcf7_validate_email*', 'custom_email_validation_filter', 10, 2); // Campo de email requerido
Sé que esto está orientado a la verificación de correo electrónico. Sin embargo, lo que me está confundiendo es qué necesito cambiar para hacer que esto funcione para una casilla de verificación y un menú desplegable.
He encontrado una solución alternativa para esto que funciona en IE, Chrome y Firefox. En lugar de usar un enfoque PHP, decidí utilizar jQuery. No es una solución completa pero puede ser útil para cualquiera que necesite implementar esto.
<script type="text/javascript">
/*! Script jQuery para ocultar ciertos campos de formulario */
$(document).ready(function () {
//Ocultar el campo inicialmente
$("#hide").hide();
//Mostrar el campo de texto solo cuando se elige la tercera opción
$('#dropdown').change(function () {
if ($("#dropdown").val() == "Other") {
$("#hide").show();
var input = $("#hide");
if (input.length > 0) { //Si el campo de entrada contiene algún valor, eliminarlo
input.val('');
}
} else {
$("#hide").hide();
var input = $("#hide");
input.val("NA"); //agregar valor NA al campo oculto que es requerido!
}
});
});
</script>
Esto agregará "NA" al campo requerido, evitando así la validación de campo obligatorio.

Esta solución funcionó para mí. En mi caso, si la casilla de verificación estaba marcada, la dirección era obligatoria.
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, 'La dirección es obligatoria.' );
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 );

Acabo de encontrarme con este problema en un proyecto y he escrito un pequeño tutorial sobre cómo lo he solucionado. Espero que esto ayude a alguien en el futuro:
https://wpharvest.com/contact-form-7-custom-fields-validation/
