Как санитизировать массив тегов в WordPress?

2 авг. 2011 г., 23:58:59
Просмотры: 22.9K
Голосов: 17

У меня есть пользовательская форма поста, которая отправляет данные на страницу, использующую wp_insert_post для создания записи. Я легко могу санитизировать большинство данных, но у меня возникли проблемы с тегами, которые я получаю в массиве:

$tags = $_POST['tags'];

Как правильно санитизировать все имена тегов перед их использованием в качестве tags_input?

Спасибо!

0
Все ответы на вопрос 4
5
46

Вот способ сделать это с помощью функции array map в PHP:

// Хорошая практика — убедиться, что переменные установлены перед использованием
$tags = isset( $_POST['tags'] ) ? (array) $_POST['tags'] : array();

// Здесь можно использовать любую из функций санитизации данных WordPress
$tags = array_map( 'esc_attr', $tags );
21 авг. 2011 г. 16:15:38
Комментарии

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

jibiel jibiel
15 мая 2013 г. 12:30:04

Да, похоже, это правильный путь.

Miguel Garrido Miguel Garrido
4 дек. 2015 г. 01:56:51

Думаю, это хорошая практика

WordPress Mechanic WordPress Mechanic
1 окт. 2016 г. 14:58:34

+1 да! именно это мне и было нужно.

Frank Frank
6 окт. 2020 г. 15:11:12

Функции типа esc_attr() НЕ выполняют санитизацию, и никогда не должны использоваться для этой цели.

Единственное исключение - это URL, которые при сохранении могут использовать esc_url() или esc_url_raw().

mujuonly mujuonly
4 нояб. 2020 г. 09:14:54
3

Мне понадобилась рекурсивная санация, поэтому вот моё решение:


/**
 * Рекурсивная санация для массива
 * 
 * @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;
}
5 февр. 2017 г. 11:14:46
Комментарии

Что означает & перед $value?

Daniel Daniel
23 июн. 2018 г. 11:13:50

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

Broshi Broshi
23 июн. 2018 г. 23:09:35

Спасибо - отличное решение, простое и элегантное.

Clinton Clinton
8 мая 2020 г. 22:59:46
1

Если кому-то интересно, я решил это так:

        $tags = $_POST['tags'];
        if (count($tags) > 5){
            echo 'Не более 5 тегов';
            $stop = true;
        }

        if (is_array($tags)) {
            foreach ($tags as &$tag) {
                $tag = esc_attr($tag);
            }
            unset($tag );
        } else {
            $tags = esc_attr($tags);
        }
21 авг. 2011 г. 16:03:30
Комментарии

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

onetrickpony onetrickpony
21 авг. 2011 г. 16:45:04
0

Эту функцию можно использовать практически во всех случаях.

/**
 * Рекурсивная санитизация для текста или массива
 * 
 * @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;
}
9 февр. 2017 г. 22:24:45