¿Cómo sanitizar un array en WordPress?

2 ago 2011, 23:58:59
Vistas: 22.9K
Votos: 17

Tengo un formulario de publicación personalizado que envía datos a una página que utiliza wp_insert_post para crear una entrada. Puedo sanitizar fácilmente la mayoría de los datos, pero tengo algunos problemas con mis etiquetas, que recibo en un array:

$tags =  $_POST['tags'];

Antes de usar estas etiquetas como tags_input, ¿cómo puedo sanitizar todos los nombres de manera exitosa?

¡Gracias!

0
Todas las respuestas a la pregunta 4
5
46

Aquí hay una forma de hacerlo con la función array map de PHP:

// Buena idea verificar que las variables estén definidas antes de usarlas
$tags = isset( $_POST['tags'] ) ? (array) $_POST['tags'] : array();

// Cualquiera de las funciones de saneamiento de datos de WordPress puede usarse aquí
$tags = array_map( 'esc_attr', $tags );
21 ago 2011 16:15:38
Comentarios

+1 Parece la forma correcta de hacerlo — http://stackoverflow.com/a/4861080/535406

jibiel jibiel
15 may 2013 12:30:04

Sí, esto parece ser el camino a seguir.

Miguel Garrido Miguel Garrido
4 dic 2015 01:56:51

Creo que es una buena práctica

WordPress Mechanic WordPress Mechanic
1 oct 2016 14:58:34

+1 ¡sí! eso es exactamente lo que necesitaba.

Frank Frank
6 oct 2020 15:11:12

Funciones como esc_attr() NO sanitizan nada, y nunca deberían usarse con ese propósito.

La única excepción a esto son las URLs, que pueden usar esc_url() o esc_url_raw() cuando se guardan.

mujuonly mujuonly
4 nov 2020 09:14:54
3

Necesitaba una sanitización recursiva, así que aquí está mi solución:

/**
 * Sanitización recursiva para un array
 * 
 * @param $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 feb 2017 11:14:46
Comentarios

¿Para qué sirve ese & antes de $value?

Daniel Daniel
23 jun 2018 11:13:50

Cuando iteras un array en una sentencia foreach, trabaja sobre una copia de ese array. Así que si realmente quieres modificar $value, debes agregar & antes. Mira https://stackoverflow.com/questions/3307409/php-pass-by-reference-in-foreach

Broshi Broshi
23 jun 2018 23:09:35

Gracias - buena solución, simple pero elegante.

Clinton Clinton
8 may 2020 22:59:46
1

Si a alguien le interesa, lo resolví de esta manera:

        $tags = $_POST['tags'];
        if (count($tags) > 5){
            echo 'No más de 5 etiquetas';
            $stop = true;
        }

        if (is_array($tags)) {
            foreach ($tags as &$tag) {
                $tag = esc_attr($tag);
            }
            unset($tag);
        } else {
            $tags = esc_attr($tags);
        }
21 ago 2011 16:03:30
Comentarios

deberías usar sanitize_term en lugar de esc_attr, para tu caso particular

onetrickpony onetrickpony
21 ago 2011 16:45:04
0

Puedes usar esta función para casi todos los casos.

/**
 * Saneamiento recursivo para texto o array
 * 
 * @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 feb 2017 22:24:45