Cómo modificar la salida de respuesta de éxito/error en Contact Form 7
Estoy tratando de encontrar una manera de anular o filtrar la salida de los cuadros de respuesta de Contact Form 7 que se muestran cuando aparece un mensaje de error o éxito.
Por defecto, Contact Form 7 genera este HTML cuando un formulario se envía correctamente:
<div class="wpcf7-response-output wpcf7-display-none wpcf7-mail-sent-ok" style="display: block;" role="alert">
¡Gracias por suscribirte!
</div>
En efecto, quiero cambiar el HTML de salida de la respuesta para que sea una alerta descartable de Bootstrap como esta:
<div class="wpcf7-response-output wpcf7-display-none alert alert-success" role="alert">
¡Gracias por suscribirte!
</div>
He intentado examinar la documentación de Contact Form 7 y he revisado el código fuente del plugin para encontrar el filtro que creo que necesito, pero no puedo hacer que cambie la salida HTML de la respuesta. Este es el código que he probado:
function filter_wpcf7_response_output( $output ){
// Reemplazar la clase CSS de éxito
$output = str_replace( ' wpcf7-mail-sent-ok', ' alert alert-success', $output );
return $output;
}
add_filter( 'wpcf7_form_response_output', 'filter_wpcf7_response_output', 10, 1 );
Pero parece que no cambia la salida en absoluto... ¡Cualquier ayuda sería muy apreciada!
Después de analizar esto más a fondo, me di cuenta de que las respuestas que se muestran son generadas mediante el AJAX de Contact Form 7.
Así que, siguiendo la documentación de Contact Form 7 sobre Eventos DOM, pude hacer que funcionara como deseaba con el siguiente código JS:
/* Eventos de validación para cambiar las clases CSS de respuesta */
document.addEventListener( 'wpcf7invalid', function( event ) {
$('.wpcf7-response-output').addClass('alert alert-danger');
}, false );
document.addEventListener( 'wpcf7spam', function( event ) {
$('.wpcf7-response-output').addClass('alert alert-warning');
}, false );
document.addEventListener( 'wpcf7mailfailed', function( event ) {
$('.wpcf7-response-output').addClass('alert alert-warning');
}, false );
document.addEventListener( 'wpcf7mailsent', function( event ) {
$('.wpcf7-response-output').addClass('alert alert-success');
}, false );

Esto está bien... ¿Pero por qué usar jQuery para el selector pero no para el event listener? Úsalo para ambos o para ninguno

Mala noticia, no hay filtros en los mensajes mostrados, así que tenemos que manejarlo desde JavaScript. ¡Esta respuesta es por ahora la única forma de conseguirlo!

Probablemente deberías eliminar las clases .alert-*
antes de añadir una nueva clase en cada event listener para evitar agregar múltiples clases .alert-*
después de activar más de un evento al interactuar con el formulario.
Puedes añadir esto encadenado antes de .addClass()
:
.removeClass(function (index, className) { return (className.match (/(^|\s)alert-\S+/g) || []).join(' '); })
También ten en cuenta que aún podrías necesitar sobrescribir los estilos para .wpcf7-response-output
en la hoja de estilos de tu tema, ya que el plugin usa estilos para esa clase que modifican algunos de los estilos de bootstrap.
