# wp_kses_hair()

URL: https://chugunov.pro/api-wordpress/functions/wp_kses_hair/
Проверено на WordPress 6.9, обновлено 06.08.2026.
Источник: независимый русскоязычный справочник chugunov.pro. Не является официальной документацией WordPress.

Тип: функция.
Появился в версии: 1.0.0.

## Сигнатура

```php
wp_kses_hair( string $attr, string[] $allowed_protocols ): array<string,
```

## Описание

Выполняет ряд преобразований при разборе строк атрибутов:
Нормализует значения атрибутов и заключает их в двойные кавычки.
Нормализует ссылки на HTML-символы внутри значений атрибутов.
Удаляет «плохие» URL-протоколы из значений атрибутов.
В остальном читает атрибуты так, как если бы они были частью HTML-тега. Эти преобразования снижают риск ошибочного разбора в дальнейшем и обеспечивают очистку URL в соответствии с остальной подсистемой kses. Важно, что значения атрибутов не декодируются: специальные символы синтаксиса HTML остаются в свойстве value в виде ссылок на символы.
Пример:
$attrs = wp_kses_hair( 'class="is-wide" inert data-lazy=\'<img&#00062\' =/🐮=/' );
$attrs === array(
'class' => array( 'name' => 'class', 'value' => 'is-wide', 'whole' => 'class="is-wide"', 'vless' => 'n' ),
'inert' => array( 'name' => 'inert', 'value' => '', 'whole' => 'inert', 'vless' => 'y' ),
'data-lazy' => array( 'name' => 'data-lazy', 'value' => '<img>', 'whole' => 'data-lazy="<img>"', 'vless' => 'n' ),
'=' => array( 'name' => '=', 'value' => '', 'whole' => '=', 'vless' => 'y' ),
'🐮' => array( 'name' => '🐮', 'value' => '/', 'whole' => '🐮="/"', 'vless' => 'n' ),
);

## Параметры

- `$attr` `string` — обязательный. Список атрибутов от HTML-элемента до его закрывающего тега.
- `$allowed_protocols` `string[]` — обязательный. Массив разрешённых URL-протоколов.

## Возвращаемое значение

`array<string,` — 'y'|'n'

## Исходный код

Файл: `wp-includes/kses.php:1619`

```php
function wp_kses_hair( $attr, $allowed_protocols ) {
	$attributes = array();
	$uris       = wp_kses_uri_attributes();

	$processor = new WP_HTML_Tag_Processor( "<wp {$attr}>" );
	$processor->next_token();

	$attribute_names = $processor->get_attribute_names_with_prefix( '' );
	if ( null === $attribute_names || 0 === count( $attribute_names ) ) {
		return $attributes;
	}

	$syntax_characters = array(
		'&' => '&amp;',
		'<' => '&lt;',
		'>' => '&gt;',
		"'" => '&apos;',
		'"' => '&quot;',
	);

	foreach ( $attribute_names as $name ) {
		$value   = $processor->get_attribute( $name );
		$is_bool = true === $value;
		if ( is_string( $value ) && in_array( $name, $uris, true ) ) {
			$value = wp_kses_bad_protocol( $value, $allowed_protocols );
		}

		// Reconstruct and normalize the attribute value.
		$recoded = $is_bool ? '' : strtr( $value, $syntax_characters );
		$whole   = $is_bool ? $name : "{$name}=\"{$recoded}\"";

		$attributes[ $name ] = array(
			'name'  => $name,
			'value' => $recoded,
			'whole' => $whole,
			'vless' => $is_bool ? 'y' : 'n',
		);
	}

	return $attributes;
}
```

## История изменений

- 7.0.0 — Reliably parses HTML via the HTML API.
- 1.0.0 — Introduced.

## Связанные

Использует: `WP_HTML_Tag_Processor::__construct`, [`wp_kses_uri_attributes`](https://chugunov.pro/api-wordpress/functions/wp_kses_uri_attributes/), [`wp_kses_bad_protocol`](https://chugunov.pro/api-wordpress/functions/wp_kses_bad_protocol/).
Используется в: [`wp_rel_callback`](https://chugunov.pro/api-wordpress/functions/wp_rel_callback/), [`wp_filter_oembed_iframe_title_attribute`](https://chugunov.pro/api-wordpress/functions/wp_filter_oembed_iframe_title_attribute/), [`wp_targeted_link_rel_callback`](https://chugunov.pro/api-wordpress/functions/wp_targeted_link_rel_callback/), [`wp_kses_attr`](https://chugunov.pro/api-wordpress/functions/wp_kses_attr/).

Оригинал в официальной документации: https://developer.wordpress.org/reference/functions/wp_kses_hair/
