Cum să sanitizezi un array în WordPress?
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!

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

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

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

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

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

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

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