Come sanificare un array di tag in WordPress?

2 ago 2011, 23:58:59
Visualizzazioni: 22.9K
Voti: 17

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!

0
Tutte le risposte alla domanda 4
5
46

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 );
21 ago 2011 16:15:38
Commenti

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

jibiel jibiel
15 mag 2013 12:30:04

Sì, sembra la strada da percorrere.

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

Penso sia una buona pratica

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

+1 sì! è esattamente ciò di cui avevo bisogno.

Frank Frank
6 ott 2020 15:11:12

Le funzioni come esc_attr() NON sanitizzano alcunché e non dovrebbero mai essere utilizzate a tale scopo.

L'unica eccezione sono gli URL, che possono utilizzare esc_url() o esc_url_raw() quando vengono salvati.

mujuonly mujuonly
4 nov 2020 09:14:54
3

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;
}
5 feb 2017 11:14:46
Commenti

A cosa serve quel & prima di $value?

Daniel Daniel
23 giu 2018 11:13:50

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

Broshi Broshi
23 giu 2018 23:09:35

Grazie - bella soluzione, semplice ma elegante.

Clinton Clinton
8 mag 2020 22:59:46
1

Se qualcuno è interessato, ho risolto così:

        $tags = $_POST['tags'];
        if (count($tags) > 5){
            echo 'Non più di 5 tag';
            $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
Commenti

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

onetrickpony onetrickpony
21 ago 2011 16:45:04
0

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;
}
9 feb 2017 22:24:45