Cum să sanitizezi un array în WordPress?

2 aug. 2011, 23:58:59
Vizualizări: 22.9K
Voturi: 17

Am un formular personalizat pentru postări care trimite date către o pagină ce folosește wp_insert_post pentru a crea o postare. Pot sanitiza ușor majoritatea datelor, dar am probleme cu tag-urile mele, pe care le primesc într-un array:

$tags =  $_POST['tags'];

Înainte de a folosi aceste tag-uri ca tags_input, cum pot sanitiza cu succes toate numele?

Mulțumesc!

0
Toate răspunsurile la întrebare 4
5
46

Iată o modalitate de a face acest lucru folosind funcția array map din PHP:

// Este o idee bună să te asiguri că variabilele sunt setate înainte de a le folosi
$tags = isset( $_POST['tags'] ) ? (array) $_POST['tags'] : array();

// Oricare dintre funcțiile de curățare a datelor din WordPress poate fi folosită aici
$tags = array_map( 'esc_attr', $tags );
21 aug. 2011 16:15:38
Comentarii

+1 Pare a fi metoda corectă de a face asta — http://stackoverflow.com/a/4861080/535406

jibiel jibiel
15 mai 2013 12:30:04

Da, aceasta pare a fi soluția potrivită.

Miguel Garrido Miguel Garrido
4 dec. 2015 01:56:51

Cred că este o practică bună

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

+1 da! exact de asta aveam nevoie.

Frank Frank
6 oct. 2020 15:11:12

Funcțiile precum esc_attr() NU sanitizează nimic și nu ar trebui folosite niciodată în acest scop.

Singura excepție de la această regulă o reprezintă URL-urile, care pot folosi esc_url() sau esc_url_raw() atunci când sunt salvate.

mujuonly mujuonly
4 nov. 2020 09:14:54
3

Am avut nevoie de o curățare recursivă, așa că iată soluția mea:

/**
 * Curățare recursivă pentru 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
Comentarii

La ce servește & înaintea $value?

Daniel Daniel
23 iun. 2018 11:13:50

Când iterezi un array într-o instrucțiune foreach, operația se face pe o copie a acelui array. Deci, dacă chiar vrei să modifici $value, trebuie să adaugi & înaintea sa. vezi https://stackoverflow.com/questions/3307409/php-pass-by-reference-in-foreach

Broshi Broshi
23 iun. 2018 23:09:35

Mulțumesc - soluție frumoasă, simplă și elegantă.

Clinton Clinton
8 mai 2020 22:59:46
1

Dacă este cineva interesat, am rezolvat astfel:

        $tags = $_POST['tags'];
        if (count($tags) > 5){
            echo 'Nu mai mult de 5 etichete';
            $stop = true;
        }

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

ar trebui să folosești sanitize_term în loc de esc_attr, pentru cazul tău particular

onetrickpony onetrickpony
21 aug. 2011 16:45:04
0

Puteți folosi această funcție în aproape toate cazurile.

/**
 * Sanitizare recursivă pentru text sau 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