¿Cómo sanitizar un array en WordPress?
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!

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 );

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

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;
}

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

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);
}

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

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;
}
