Come sanificare un array di tag in WordPress?
Ho un modulo personalizzato per i post che invia dati a una pagina che utilizza wp_insert_post per creare un post. Posso facilmente sanificare la maggior parte dei dati, ma ho alcune difficoltà con i miei tag, che recupero in un array:
$tags = $_POST['tags'];
Prima di utilizzare questi tag come tags_input, come posso sanificare correttamente tutti i nomi?
Ecco alcune soluzioni sicure per sanificare l'array di tag:
// Metodo 1: Usando array_map con sanitize_text_field
$tags = array_map('sanitize_text_field', $_POST['tags']);
// Metodo 2: Usando array_filter e array_map insieme
$tags = array_map('sanitize_text_field',
array_filter($_POST['tags'], 'strlen')
);
// Metodo 3: Usando sanitize_term_field per ogni elemento
$sanitized_tags = array();
foreach($_POST['tags'] as $tag) {
$sanitized_tags[] = sanitize_term_field('name', $tag, 0, 'post_tag', 'display');
}
Inoltre, è sempre una buona pratica verificare se l'array esiste prima di elaborarlo:
if (isset($_POST['tags']) && is_array($_POST['tags'])) {
$tags = array_map('sanitize_text_field', $_POST['tags']);
} else {
$tags = array(); // array vuoto come fallback
}
Grazie!

Ecco un modo per farlo con la funzione array map di PHP:
// È buona norma verificare che i valori siano impostati prima di utilizzarli
$tags = isset( $_POST['tags'] ) ? (array) $_POST['tags'] : array();
// Qui si può usare qualsiasi funzione di sanitizzazione dei dati di WordPress
$tags = array_map( 'esc_attr', $tags );

+1 Sembra il modo giusto per farlo — http://stackoverflow.com/a/4861080/535406

Ho avuto bisogno di una sanitizzazione ricorsiva, quindi ecco la mia soluzione:
/**
* Sanitizzazione ricorsiva per 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;
}

Quando si itera un array in un'istruzione foreach
, l'operazione viene eseguita su una copia dell'array. Quindi, se vuoi davvero modificare $value
, devi aggiungere &
prima di esso.
Vedi https://stackoverflow.com/questions/3307409/php-pass-by-reference-in-foreach

dovresti usare sanitize_term invece di esc_attr, per il tuo caso specifico

Puoi utilizzare questa funzione per quasi tutti i casi.
/**
* Sanificazione ricorsiva per testo 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;
}
