wp_kses()
Чистит строку, оставляя в ней только указанные HTML теги, их атрибуты и значения атрибутов.
Также функция убирает некоторые HTML сущности.
Ожидает НЕэкранированную строку! Это значит, что перед использование нужно удалить все экранные слэши (см. wp_unslash()), которые WP автоматически добавляет для любого $_POST запроса, так как это делал PHP (PHP's magic quotes) до версии 5.4.
KSES (рекурсивный акроним от KSES Strips Evil Scripts) — подсистема в WordPress (изначально написанная Ulf Harnhammar), предназначенная для проверки и очистки текста, введённого пользователем. Позволяет задать список допустимых тэгов, стилей и протоколов, и на основе этих параметров убрать из текста пользователя всё, что им не соответствует.
Хуков нет.
Возвращает
Строку
.
Использование
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()
Примеры
#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;
#2 Оставим теги, которые допустимы при комментировании
$text = "<div>1111</div><strong>222</strong>"; $text = wp_kses( $text, 'default' ); echo $text; // выведет // 1111<strong>222</strong>
#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() )
#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>
остался.
Заметки
- Смотрите: wp_kses_post() for specifically filtering post content and fields.
- Смотрите: wp_allowed_protocols() for the default allowed protocols in link URLs.
Список изменений
С версии 1.0.0 | Введена. |
Код wp_kses() wp kses WP 6.5.2
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 ); }