web-dev-qa-db-fra.com

Valider un tableau d'options

Nous utilisons la fonction WordPress register_setting() par défaut pour valider les options du thème. Cet appel, par exemple:

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

Validera si $option1 est un entier ou non.

Que puis-je utiliser pour transmettre un tableau d'options afin de valider chaque membre du tableau?

Par exemple:

$options = array(
    'options1' => 4,              // intval
    'options2' => '127.0.0.1',    // IP address
    'options3' => '[email protected]' // Email address
);
3
Ünsal Korkmaz

Ce que vous devez faire, c'est créer votre propre fonction de validation des données. Ozh a écrit un excellent tutoriel à propos de cela plus tôt, mais voici l'essentiel ...

Supposons que votre tableau d'options s'appelle $my_options et qu'il contient trois champs, 'text', 'age' et 'isauthorized'.

Vous voudriez toujours l'enregistrer de la même manière:

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

Mais vous voyez comment nous avons utilisé un rappel personnalisé pour le troisième paramètre? Il ne reste plus qu’à définir cette fonction personnalisée:

function my_validation_function( $input ) {
    // Validate age as an integer
    $input['age'] = intval( $input['age'] );

    // Strip HTML tags from text to make it safe
    $input['text'] = wp_filter_nohtml_kses( $input['text'] );

    // Make sure isauthorized is only true or false (0 or 1)
    $input['isauthorized'] = ( $input['isauthorized'] == 1 ? 1 : 0 );

    return $input;
}

Alternativement

Si vous voulez rendre vos fonctions de validation un peu plus flexibles, vous pouvez utiliser les filtres intégrés de WordPress pour éviter de devoir répéter votre code. Vous enregistrez toujours votre validation de la même manière:

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

Mais au lieu de vérifier chaque élément de votre tableau dans la fonction de validation, vous parcourez le tableau et déléguez des filtres:

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

    return $input
}

Vous pouvez maintenant vous connecter à la logique de validation dont vous avez besoin:

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

Si vous n'ajoutez pas de filtre pour l'une de vos options, la valeur de l'option restera inchangée. Les filtres sont également ce que vous voulez utiliser avec les fonctions qui returncontent). Vous pouvez en ajouter autant que vous le souhaitez ... ou associer vos filtres à n’importe quel champ.

Disons que vous avez deux champs numériques dans votre tableau - age et numberChildren. Au lieu de créer une fonction de validation supplémentaire capable de gérer le champ numberChildren, vous l'ajoutez simplement au filtre:

add_filter( 'my_validation_numberChildren', 'validate_numeric' );
11
EAMann

Il semble que la solution "utilisation de fonction différente pour chaque option dans array" ne ressemble pas à mon rêve, mais cela devrait fonctionner:

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

et puis je peux utiliser des fonctions personnalisées pour chaque validation d'option comme ceci:

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

Ecrire ici pour les futurs visiteurs. Accepter la solution d'EAMann.

1
Ünsal Korkmaz