Validate an option array
Utilizziamo la funzione predefinita di WordPress register_setting()
per validare le opzioni del tema. Questa chiamata, ad esempio:
register_setting( 'options-group', 'option1', 'intval' );
Validerà se $option1
è un intero o meno.
Cosa posso usare per passare un array di opzioni e validare ogni membro dell'array?
Per esempio:
$options = array(
'options1' => 4, // intval
'options2' => '127.0.0.1', // indirizzo IP
'options3' => 'test@test.com' // indirizzo email
);

Ciò che devi fare è costruire la tua funzione di validazione dei dati. Ozh ha scritto un ottimo tutorial su questo argomento in precedenza, ma ecco l'essenziale...
Supponi che il tuo array di opzioni si chiami $my_options
e contenga tre campi, 'text'
, 'age'
, e 'isauthorized'
.
Dovresti ancora registrarlo nello stesso modo:
register_setting( 'my_setting', 'my_options', 'my_validation_function' );
Ma vedi come abbiamo usato una callback personalizzata per il terzo parametro? Ora dobbiamo solo definire quella funzione personalizzata:
function my_validation_function( $input ) {
// Convalida l'età come intero
$input['age'] = intval( $input['age'] );
// Rimuovi i tag HTML dal testo per renderlo sicuro
$input['text'] = wp_filter_nohtml_kses( $input['text'] );
// Assicurati che isauthorized sia solo true o false (0 o 1)
$input['isauthorized'] = ( $input['isauthorized'] == 1 ? 1 : 0 );
return $input;
}
In alternativa
Se vuoi rendere le tue funzioni di validazione un po' più flessibili, puoi usare i filtri integrati di WordPress per evitare di ripetere il tuo codice. Registri ancora la validazione nello stesso modo:
register_setting( 'my_setting', 'my_options', 'my_validation_function' );
Ma invece di controllare ogni elemento del tuo array all'interno della funzione di validazione, iteri attraverso l'array e deleghi ai filtri:
function my_validation_function( $input ) {
foreach( $input as $key => $value ) {
$input[$key] = apply_filters( 'my_validation_' . $key, $value );
}
return $input
}
Ora puoi collegare qualsiasi logica di validazione ti serva:
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;
}
Se non aggiungi un filtro per una delle tue opzioni, il valore dell'opzione rimarrà invariato. I filtri sono anche il modo in cui vuoi procedere con le funzioni che restituiscono contenuto, e puoi aggiungerne quanti vuoi... o collegare i tuoi filtri a qualsiasi campo.
Supponi di avere due campi numerici nel tuo array - age
e numberChildren
. Invece di creare una funzione di validazione aggiuntiva che possa gestire il campo numberChildren
, lo aggiungi semplicemente al filtro:
add_filter( 'my_validation_numberChildren', 'validate_numeric' );

Mi piace questo approccio alternativo, ma come gestiresti il salvataggio delle checkbox? Vengono inviate tramite POST solo se sono selezionate, quindi il foreach
che scorre ogni risultato non salverà una checkbox deselezionata.

Ragazzi, come funziona questa validazione? Se un input è sbagliato nulla dovrebbe essere salvato, l'utente dovrebbe vedere l'input errato e un messaggio di validazione utile. add_settings_error()
è la soluzione!

Questa non è validazione ma sanitizzazione. Tuttavia, WordPress ha una buona parte di funzioni mal progettate o nominate male. Questa è sovraccaricata sia con sanitizzazione che validazione. Per non aggiornare l'opzione a causa di valori non validi basta restituire il vecchio valore. È anche saggio aggiungere un errore utile usando add_settings_error().

Sembra che la soluzione "utilizzo di funzioni diverse per ogni opzione nell'array" non sia esattamente come l'avevo immaginata, ma penso che dovrebbe funzionare:
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;
}
E poi posso usare funzioni personalizzate per la validazione di ogni opzione in questo modo:
add_action('my_validation_age', 'my_validation_function_for_age', 10, 2);
function my_validation_function_for_age($option, $value) {
$input[$option] = intval( $value );
}
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 );
}
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 );
}
Scrivo qui per i visitatori futuri. Accetto la soluzione di EAMann.
