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 956-958
return apply_filters( 'wpcf7_form_elements', $this->replace_all_form_tags() );