WordPress как на ладони

wpcf7_form_elementsхук-фильтрCF7 1.0

Позволяет изменить 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
-

Примеры

0

#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>
0

#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_ContactForm::form_elements()
wpcf7_form_elements
contact-form-7/includes/contact-form.php 946-948
return apply_filters( 'wpcf7_form_elements',
	$this->replace_all_form_tags()
);

Где используется хук в Contact Form 7

Использование не найдено.
campusboy 4748youtube.com/c/wpplus
Создатель YouTube канала wp-plus, на котором делюсь своим опытом. Активный пользователь wp-kama.ru. WordPress-разработчик. Разработка сайтов и лендингов. Доработка существующих проектов. Сопровождение ресурсов.
Редакторы: Kama 9616
2 комментария
    Войти