Validarea unui array de opțiuni
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
);

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

Î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ă.

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!

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().

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.

Î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.
