wpcf7_form_elements
Позволяет изменить html содержимое шаблона письма, в котором теги письма уже преобразованы.
Использование
add_filter( 'wpcf7_form_elements', 'wp_kama_wpcf7_form_elements_filter' );
/**
* Function for `wpcf7_form_elements` filter-hook.
*
* @param $replace_all_form_tags
*
* @return
*/
function wp_kama_wpcf7_form_elements_filter( $replace_all_form_tags ){
// filter...
return $replace_all_form_tags;
}
- $replace_all_form_tags
- -
Примеры
#1 Пример данных, приходящих в фильтр
add_filter( 'wpcf7_form_elements', function ( $html ) {
print_r( $html, true );
return $html;
} );
Шаблон письма:
<label> Your name [text* your-name] </label> <label> Your email [email* your-email] </label> <label> Тема [text* your-subject] </label> <label> Your message (optional) [textarea your-message] </label> [submit "Submit"]
Придёт в фильтр:
<p><label> Your name<br /> <span class="wpcf7-form-control-wrap your-name"><input type="text" name="your-name" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required" aria-required="true" aria-invalid="false" /></span> </label></p> <p><label> Your email<br /> <span class="wpcf7-form-control-wrap your-email"><input type="email" name="your-email" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-email wpcf7-validates-as-required wpcf7-validates-as-email" aria-required="true" aria-invalid="false" /></span> </label></p> <p><label> Тема<br /> <span class="wpcf7-form-control-wrap your-subject"><input type="text" name="your-subject" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required" aria-required="true" aria-invalid="false" /></span> </label></p> <p><label> Your message (optional)<br /> <span class="wpcf7-form-control-wrap your-message"><textarea name="your-message" cols="40" rows="10" class="wpcf7-form-control wpcf7-textarea" aria-invalid="false"></textarea></span> </label></p> <p><input type="submit" value="Submit" class="wpcf7-form-control wpcf7-submit" /></p>
#2 Заменим <input type="submit"> на <button type="submit"> с сохранением всех атрибутов
Иногда для кнопки отправки формы нужно применить стили с помощью псевдоклассов before и after, но спецификация css этого сделать не позволяет. Но если input заменить на button - задача решится.
Вариант с DOMDocument() и DOMXpath():
add_filter( 'wpcf7_form_elements', function ( $html ) {
// Статус процесса - была ли сделана замена (пока нет)
$status = false;
// Берём наш швейцарский нож по работе с html
$doc = new DOMDocument();
// Конвертируем контент c UTF-8 в HTML-ENTITIES, чтобы библиотека DOMDocument сделала всё правильно
$content = mb_convert_encoding( $html, 'HTML-ENTITIES', 'UTF-8' );
// Создаём из контента специальный объект, с которым можно работать
$doc->loadHTML( $content );
// Инструмент для работы с Xpath
$xpath = new DOMXpath( $doc );
/**
* Находим все input=submit
*
* @var DOMElement $input
*/
foreach ( $xpath->query( "//input[@type='submit']" ) as $input ) {
if ( $input->hasAttribute( 'value' ) ) {
// Создаем элемент button
$button = $doc->createElement( 'button', $input->getAttribute( 'value' ) );
/**
* "Переносим" все атрибуты от input к button
*
* @var DOMAttr
*/
foreach ( $input->attributes as $attr ) {
$button->setAttribute( $attr->name, $attr->value );
}
// Заменяем input на свежесгенерированный button
$input->parentNode->replaceChild( $button, $input );
// Меняем статус - замена была!
$status = true;
}
}
// Если замена была, то отдаём новый контент
if ( $status ) {
return $doc->saveHtml();
}
return $html;
} );
Вариант с использование регулярных выражений
Этот вариант работает в 4 раза быстрее (0.0001 сек против 0.0004 сек). Как видно скорости выполнения кода настолько маленькие для такого маленького куска HTML, что на это можно закрыть глаза и делать так как удобнее.
add_filter( 'wpcf7_form_elements', function ( $html ) {
preg_match( '~<input([^>]+)type=["\']submit["\']([^>/]+)/?>~i', $html, $match );
if( $match ){
$input = $match[0];
$attr = trim( $match[1] . $match[2] );
preg_match( '/value=["\']([^"\']+)/', $input, $mm );
$button_text = $mm[1];
$html = str_replace( $input, "<button $attr>$button_text</button>", $html );
}
return $html;
} );
Где вызывается хук
wpcf7_form_elements
contact-form-7/includes/contact-form.php 959-961
return apply_filters( 'wpcf7_form_elements', $this->replace_all_form_tags() );
Где используется хук в Contact Form 7
contact-form-7/modules/turnstile/turnstile.php 116
add_filter( 'wpcf7_form_elements', 'wpcf7_turnstile_prepend_widget', 10, 1 );