Как санитизировать массив тегов в WordPress?
У меня есть пользовательская форма поста, которая отправляет данные на страницу, использующую wp_insert_post для создания записи. Я легко могу санитизировать большинство данных, но у меня возникли проблемы с тегами, которые я получаю в массиве:
$tags = $_POST['tags'];
Как правильно санитизировать все имена тегов перед их использованием в качестве tags_input?
Спасибо!

Вот способ сделать это с помощью функции array map в PHP:
// Хорошая практика — убедиться, что переменные установлены перед использованием
$tags = isset( $_POST['tags'] ) ? (array) $_POST['tags'] : array();
// Здесь можно использовать любую из функций санитизации данных WordPress
$tags = array_map( 'esc_attr', $tags );

+1 Похоже, это правильный способ сделать это — http://stackoverflow.com/a/4861080/535406

Мне понадобилась рекурсивная санация, поэтому вот моё решение:
/**
* Рекурсивная санация для массива
*
* @param array $array Входной массив для санации
*
* @return mixed Очищенный массив
*/
function recursive_sanitize_text_field($array) {
foreach ( $array as $key => &$value ) {
if ( is_array( $value ) ) {
$value = recursive_sanitize_text_field($value);
}
else {
$value = sanitize_text_field( $value );
}
}
return $array;
}

Когда вы перебираете массив в операторе foreach
, он работает с копией этого массива. Поэтому если вы действительно хотите изменить $value
, вам нужно добавить &
перед ним.
Смотрите https://stackoverflow.com/questions/3307409/php-pass-by-reference-in-foreach

вам следует использовать sanitize_term вместо esc_attr для вашего конкретного случая

Эту функцию можно использовать практически во всех случаях.
/**
* Рекурсивная санитизация для текста или массива
*
* @param $array_or_string (array|string) Массив или строка для санитизации
* @since 0.1
* @return mixed Очищенные данные
*/
function sanitize_text_or_array_field($array_or_string) {
if( is_string($array_or_string) ){
$array_or_string = sanitize_text_field($array_or_string);
}elseif( is_array($array_or_string) ){
foreach ( $array_or_string as $key => &$value ) {
if ( is_array( $value ) ) {
$value = sanitize_text_or_array_field($value);
}
else {
$value = sanitize_text_field( $value );
}
}
}
return $array_or_string;
}
