Validarea unui array de opțiuni

21 iun. 2012, 19:55:26
Vizualizări: 5.66K
Voturi: 3

Folosim funcția implicită WordPress register_setting() pentru a valida opțiunile temei. Acest apel, de exemplu:

register_setting( 'options-group', 'option1', 'intval' );

Va valida dacă $option1 este sau nu un întreg.

Ce pot folosi pentru a transmite un array de opțiuni pentru a valida fiecare membru al array-ului?

De exemplu:

$options = array(
    'options1' => 4,              // intval - valoare întreagă
    'options2' => '127.0.0.1',    // Adresă IP
    'options3' => 'test@test.com' // Adresă de email
);
2
Comentarii

Validarea dacă elementele există sau nu într-un array nu este chiar o întrebare specifică WordPress... este o întrebare de bază în PHP.

EAMann EAMann
21 iun. 2012 20:07:58

de fapt am scris un exemplu simplu, dar cu funcții callback este o întrebare specifică wp după părerea mea.. aceasta nu este o întrebare obișnuită de validare -.-

Ünsal Korkmaz Ünsal Korkmaz
21 iun. 2012 21:01:06
Toate răspunsurile la întrebare 2
3
11

Ceea ce trebuie să faci este să construiești propria funcție de validare a datelor. Ozh a scris un tutorial excelent despre acest lucru mai devreme, dar iată esența lui...

Presupunem că tabloul tău de opțiuni se numește $my_options și conține trei câmpuri: 'text', 'age' și 'isauthorized'.

Îl vei înregistra în același mod:

register_setting( 'my_setting', 'my_options', 'my_validation_function' );

Dar ai observat cum am folosit un callback personalizat pentru al treilea parametru? Acum trebuie doar să definim acea funcție personalizată:

function my_validation_function( $input ) {
    // Validăm vârsta ca număr întreg
    $input['age'] = intval( $input['age'] );

    // Eliminăm tagurile HTML din text pentru a-l face sigur
    $input['text'] = wp_filter_nohtml_kses( $input['text'] );

    // Asigurăm că isauthorized este doar true sau false (0 sau 1)
    $input['isauthorized'] = ( $input['isauthorized'] == 1 ? 1 : 0 );

    return $input;
}

Alternativ

Dacă dorești să faci funcțiile tale de validare puțin mai flexibile, poți folosi filtrele încorporate în WordPress pentru a evita repetarea codului. Înregistrezi validarea în același mod:

register_setting( 'my_setting', 'my_options', 'my_validation_function' );

Dar în loc să verifici fiecare element al tabloului în interiorul funcției de validare, iterezi prin tablou și delegi la filtre:

function my_validation_function( $input ) {
    foreach( $input as $key => $value ) {
        $input[$key] = apply_filters( 'my_validation_' . $key, $value );
    }

    return $input
}

Acum poți adăuga orice logică de validare ai nevoie:

add_filter( 'my_validation_age', 'validate_numeric' );
function validate_numeric( $numeric ) {
    return intval( $numeric );
}

add_filter( 'my_validation_text', 'validate_text' );
function validate_text( $text ) {
    return wp_filter_nohtml_kses( $text );
}

add_filter( 'my_validation_isauthorized', 'validate_bool' );
function validate_bool( $bool ) {
    return $bool == 1 ? 1 : 0;
}

Dacă nu adaugi un filtru pentru una dintre opțiunile tale, atunci valoarea opțiunii va rămâne neschimbată. Filtrele sunt, de asemenea, modalitatea recomandată pentru funcțiile care returnează conținut, iar tu poți adăuga câte dorești... sau să atașezi filtrele la orice câmpuri.

Să presupunem că ai două câmpuri numerice în tabloul tău - age și numberChildren. În loc să creezi o funcție suplimentară de validare care să gestioneze câmpul numberChildren, pur și simplu îl adaugi la filtru:

add_filter( 'my_validation_numberChildren', 'validate_numeric' );
21 iun. 2012 21:47:52
Comentarii

Îmi place această abordare alternativă, dar cum ai gestiona salvarea casetelor de bifat? Ele sunt trimise prin POST doar dacă sunt bifate, așa că foreach care parcurge fiecare rezultat nu va salva o casetă debifată.

donnapep donnapep
12 dec. 2015 14:57:57

Băieți, cum e această validare? Dacă o intrare este greșită, nimic nu ar trebui salvat, utilizatorul ar trebui să primească intrarea greșită și un mesaj de validare util. add_settings_error() e soluția!

Markus Malkusch Markus Malkusch
13 mar. 2016 22:04:59

Aceasta nu este validare ci sanitarizare. Totuși, WordPress are o parte semnificativă de funcții prost proiectate sau denumite. Aceasta este supraîncărcată atât cu sanitarizare cât și validare. Pentru a nu actualiza opțiunea din cauza valorilor invalide, returnează pur și simplu vechea valoare. Este de asemenea înțelept să adaugi o eroare utilă folosind add_settings_error().

Dhaval Shah Dhaval Shah
13 mar. 2019 07:08:32
1

Se pare că soluția pentru „utilizarea diferitelor funcții pentru fiecare opțiune din array” nu este exact cum am visat, dar cred că ar trebui să funcționeze:

register_setting( 'my_setting', 'my_options', 'my_validation_function' );

function my_validation_function( $input ) {
    foreach ($input as $option=>$value){
        do_action('my_validation_'.$option, $option, $value);
    }
    return $input;
}

și apoi pot folosi funcții personalizate pentru validarea fiecărei opțiuni astfel:

add_action('my_validation_age', 'my_validation_function_for_age', 10, 2);
function my_validation_function_for_age($option, $value) {
    $input[$option] = intval( $value ); // convertește valoarea în întreg
}

add_action('my_validation_text', 'my_validation_function_for_text', 10, 2);
function my_validation_function_for_text($option, $value) {
    $input[$option] = wp_filter_nohtml_kses( $value ); // elimină HTML din text
}

add_action('my_validation_isauthorized', 'my_validation_function_for_isauthorized', 10, 2);
function my_validation_function_for_isauthorized($option, $value) {
    $input[$option] = ( $value == 1 ? 1 : 0 ); // verifică dacă valoarea este 1 sau 0
}

Scriu aici pentru viitorii vizitatori. Accept soluția lui EAMann.

21 iun. 2012 23:56:22
Comentarii

În loc să păstrez 2 răspunsuri "corecte", am adăugat cea mai mare parte din codul tău ca o soluție alternativă sub a mea. De asemenea, am ales să folosesc filtre în loc de acțiuni, deoarece asta este cu adevărat ceea ce ar trebui să folosești pentru a filtra conținutul în acest fel.

EAMann EAMann
22 iun. 2012 00:31:26