Validate an option array

21 giu 2012, 19:55:26
Visualizzazioni: 5.66K
Voti: 3

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

Verificare se gli elementi esistono o meno in un array non è davvero una domanda su WordPress... è PHP di base.

EAMann EAMann
21 giu 2012 20:07:58

in realtà ho scritto un semplice esempio ma con le funzioni di callback è una domanda specifica di wp secondo me... questa non è una normale domanda di validazione -.-

Ünsal Korkmaz Ünsal Korkmaz
21 giu 2012 21:01:06
Tutte le risposte alla domanda 2
3
11

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' );
21 giu 2012 21:47:52
Commenti

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.

donnapep donnapep
12 dic 2015 14:57:57

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!

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

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

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

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.

21 giu 2012 23:56:22
Commenti

Invece di mantenere 2 risposte "corrette", ho aggiunto gran parte del tuo codice come soluzione alternativa sotto la mia. Ho anche scelto di utilizzare filtri invece di azioni poiché è davvero ciò che dovresti usare per filtrare i contenuti in questo modo.

EAMann EAMann
22 giu 2012 00:31:26