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

wp_kses()WP 1.0.0

Чистит строку, оставляя в ней только указанные HTML теги, их атрибуты и значения атрибутов.

Также функция убирает некоторые HTML сущности.

Ожидает НЕэкранированную строку! Это значит, что перед использование нужно удалить все экранные слэши (см. wp_unslash()), которые WP автоматически добавляет для любого $_POST запроса, так как это делал PHP (PHP's magic quotes) до версии 5.4.

KSES (рекурсивный акроним от KSES Strips Evil Scripts) — подсистема в WordPress (изначально написанная Ulf Harnhammar), предназначенная для проверки и очистки текста, введённого пользователем. Позволяет задать список допустимых тэгов, стилей и протоколов, и на основе этих параметров убрать из текста пользователя всё, что им не соответствует.

Работает на основе: wp_kses_allowed_html()
1 раз — 0.0003581 сек (быстро) | 50000 раз — 2.35 сек (быстро) | PHP 7.4.25, WP 6.0.1

Хуков нет.

Возвращает

Строку.

Использование

wp_kses( $string, $allowed_html, $allowed_protocols );
$string(строка) (обязательный)
Контент, который нужно очистить.
$allowed_html(массив/строка) (обязательный)

Список допустимых HTML элементов в переданном контенте. Если указать строковое значение, то оно будет означать группу предустановленных тегов:

  • post — оставит теги допустимые для постов (глобальная переменная $allowedposttags)
  • strip — вырежет все теги. Аналог функции PHP strip_tags()
  • entities — HTML сущности, как   (глобальная переменная $allowedentitynames)
  • user_description, pre_user_description — тоже что и default, только еще разрешается атрибут rel для ссылок <a>.
  • default или любая строка — список базовых допустимых тегов. Используется при очистки текста комментария: глобальная переменная $allowedtags.

Параметр может принимать строку! Хотя в комментариях функции написано только массив. см. wp_kses() → wp_kses_split()_wp_kses_split_callback()wp_kses_split2()wp_kses_allowed_html()

$allowed_protocols(массив)

Протоколы, ссылки с которыми будут допущены в контенте. По умолчанию разрешены следующие протоколы, см. wp_allowed_protocols():

http
https
ftp
ftps
mailto
news
irc
gopher
nntp
feed
telnet
mms
rtsp
svn
tel
fax
xmpp
webcal
urn

Это базовые протоколы. Протокол javascript лучше запретить для сомнительных пользователей.

По умолчанию: array()

Примеры

0

#1 Очистим контент, используя KSES WP

Оставим в нем только теги: 'a' ( с атрибутами 'href' и 'title' ), 'br', 'em' и 'strong'. Все остальное будет удалено:

$string = wp_unslash( $_POST['text'] );

// допустимые теги
$allowed_html = array(
	'a' => array(
		'href'  => true,
		'title' => true,
	),
	'br'     => array(),
	'em'     => array(),
	'strong' => array()
); 

$text = wp_kses( $string, $allowed_html );

echo $text;
0

#2 Оставим теги, которые допустимы при комментировании

$text = "<div>1111</div><strong>222</strong>";
$text = wp_kses( $text, 'default' );
echo $text;

// выведет
// 1111<strong>222</strong>
0

#3 Какие теги находятся в глобальной $allowedtags

Array(
	[a] => Array(
			[href] => 1
			[title] => 1
		)

	[abbr] => Array(
			[title] => 1
		)

	[acronym] => Array(
			[title] => 1
		)

	[b] => Array()

	[blockquote] => Array(
			[cite] => 1
		)

	[cite] => Array()

	[code] => Array()

	[del] => Array(
			[datetime] => 1
		)

	[em] => Array()

	[i] => Array()

	[q] => Array(
			[cite] => 1
		)

	[s] => Array()

	[strike] => Array()

	[strong] => Array()
)
0

#4 Как добавить свой контекст: список допустимых тегов

Для удобства можно зарегистрировать свой контекст для функции wp_kses() и укзаать для этого контекста свой список разрешенных тегов. Это можно сделать так:

add_filter( 'wp_kses_allowed_html', '_wpkama_kses_allowed_html', 0, 2 );
function _wpkama_kses_allowed_html( $tags, $context ) {
	if ( $context === 'wpkama' ) {
		return [ 
			'b' => [], 
			'strong' => [] 
		];
	}
	return $tags;
}

Теперь wp_kses() можно использовать так:

$str = 'Some text <br> <b>bols</b>';
$str = wp_kses( $str, 'wpkama' );
echo $str; // Some text  <b>bols</b>

Как мы видим <br> был вырезан, а разрешенный тег <b> остался.

Заметки

Список изменений

С версии 1.0.0 Введена.

Код wp_kses() WP 6.5.3

function wp_kses( $content, $allowed_html, $allowed_protocols = array() ) {
	if ( empty( $allowed_protocols ) ) {
		$allowed_protocols = wp_allowed_protocols();
	}

	$content = wp_kses_no_null( $content, array( 'slash_zero' => 'keep' ) );
	$content = wp_kses_normalize_entities( $content );
	$content = wp_kses_hook( $content, $allowed_html, $allowed_protocols );

	return wp_kses_split( $content, $allowed_html, $allowed_protocols );
}
5 комментариев
    Войти