Как изменить вывод успешного/ошибочного ответа в Contact Form 7
Я пытаюсь найти способ переопределить или отфильтровать вывод блоков ответа Contact Form 7, которые отображаются при показе сообщения об ошибке или успешной отправке.
По умолчанию Contact Form 7 выводит следующий HTML при успешной отправке формы:
<div class="wpcf7-response-output wpcf7-display-none wpcf7-mail-sent-ok" style="display: block;" role="alert">
Спасибо за подписку!
</div>
По сути, я хочу изменить HTML-вывод ответа, чтобы он соответствовал закрываемому оповещению Bootstrap следующим образом:
<div class="wpcf7-response-output wpcf7-display-none alert alert-success" role="alert">
Спасибо за подписку!
</div>
Я просмотрел документацию Contact Form 7 и изучил исходный код плагина в поисках нужного фильтра, но не могу добиться изменения HTML-вывода ответа. Вот код, который я пробовал:
function filter_wpcf7_response_output( $output ){
// Заменяем CSS класс успешного ответа
$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 );
Но это, похоже, вообще не меняет вывод... Буду благодарен за любую помощь!

Более детально изучив этот вопрос, я понял, что отображаемые ответы генерируются через AJAX в Contact Form 7.
Следуя документации Contact Form 7 по DOM событиям, мне удалось добиться желаемого результата с помощью следующего JS кода:
/* События валидации для изменения CSS классов ответов */
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 );

Это хорошо... Но почему использовать jQuery для селектора, но не для обработчика событий? Используйте его для обоих или ни для чего

К сожалению, здесь нет фильтров для отображаемых сообщений, поэтому приходится делать это через JavaScript. Этот ответ пока единственный способ добиться этого!

Вероятно, стоит удалить классы .alert-*
перед добавлением нового класса в каждом обработчике событий, чтобы избежать добавления нескольких классов .alert-*
при срабатывании более одного события во время взаимодействия с формой.
Вы можете добавить это в цепочку перед .addClass()
:
.removeClass(function (index, className) { return (className.match (/(^|\s)alert-\S+/g) || []).join(' '); })
Также имейте в виду, что вам, возможно, всё ещё придётся переопределить стили для .wpcf7-response-output
в таблице стилей вашей темы, так как плагин использует стили для этого класса, которые изменяют некоторые стили Bootstrap.
