Come modificare l'output delle risposte di Successo/Errore in Contact Form 7
Sto cercando un modo per sovrascrivere o filtrare l'output dei box di risposta di Contact Form 7 che vengono mostrati quando appare un messaggio di errore o di successo.
Di default, Contact Form 7 genera questo HTML quando un form viene inviato con successo:
<div class="wpcf7-response-output wpcf7-display-none wpcf7-mail-sent-ok" style="display: block;" role="alert">
Grazie per esserti iscritto!
</div>
In pratica, voglio modificare l'output HTML della risposta per trasformarlo in un alert eliminabile di Bootstrap come questo:
<div class="wpcf7-response-output wpcf7-display-none alert alert-success" role="alert">
Grazie per esserti iscritto!
</div>
Ho cercato nella documentazione di Contact Form 7 e ho esaminato il codice sorgente del plugin per trovare il filtro che penso mi serva, ma non riesco a far cambiare l'output HTML della risposta. Questo è il codice che ho provato:
function filter_wpcf7_response_output( $output ){
// Sostituisce la classe CSS di Successo
$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 );
Ma non sembra modificare l'output in alcun modo... Qualsiasi aiuto sarebbe molto apprezzato!

Dopo un'analisi più approfondita, ho capito che le risposte visualizzate sono generate tramite l'AJAX di Contact Form 7.
Quindi, seguendo la documentazione di Contact Form 7 sugli Eventi DOM, sono riuscito a far funzionare tutto come desiderato con il seguente codice JS:
/* Eventi di validazione per modificare le classi CSS delle risposte */
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 );

Questo è buono... Ma perché usare jQuery per il selettore ma non per l'event listener? Usalo per entrambi o per nessuno dei due

Sfortunatamente, non ci sono filtri sui messaggi visualizzati, quindi dobbiamo gestirlo via JavaScript. Questa risposta è finora l'unico modo per ottenerlo!

Probabilmente dovresti rimuovere le classi .alert-*
prima di aggiungere una nuova classe in ogni listener di eventi per evitare di aggiungere più classi .alert-*
dopo aver attivato più di un evento durante l'interazione con il form.
Puoi aggiungere questo alla catena prima di .addClass()
:
.removeClass(function (index, className) { return (className.match (/(^|\s)alert-\S+/g) || []).join(' '); })
Tieni anche presente che potresti comunque dover sovrascrivere gli stili per .wpcf7-response-output
nel foglio di stile del tuo tema, poiché il plugin utilizza stili per quella classe che modificano alcuni degli stili di bootstrap.
