web-dev-qa-db-fra.com

API de paramètres - nettoyage des URL, des adresses électroniques et du texte

Je demande des conseils sur les meilleures pratiques pour écrire ce code. Actuellement, j'ai des options de thème simples avec des champs de texte, affichant les informations dans mon modèle. J'utilise actuellement ce code pour les paramètres api et la désinfection du texte brut. Ma question est, un champ de paramètres supplémentaire est un champ de site Web, et aussi un champ de courrier électronique. Je ne sais pas si je dois créer une autre option de thème, une section ou un champ afin de pouvoir directement assainir les paramètres enregistrés individuellement (et correctement pour chaque type), ou si tous peuvent être combinés dans le même nettoyage oem_theme_profile_options. Je ne suis pas encore le meilleur gars php. Donc, comprendre cela en termes de meilleures pratiques m'aidera à m'éduquer pour l'avenir et ne me conduira pas à créer plusieurs options dans la base de données.

function oem_theme_initialize_profile_options() {

        if( false == get_option('oem_theme_profile_options')) {
                add_option('oem_theme_profile_options');
        }

        add_settings_section(
                'profile_settings_section',
                'Profile Options',
                'oem_profile_options_callback',
                'oem_theme_profile_options'
        );

            add_settings_field(
                    'personal_name',
                    'Name', 
                    'oem_personal_name_callback',
                    'oem_theme_profile_options',
                    'profile_settings_section'
            );
                     register_setting(
                            'oem_theme_profile_options',
                            'oem_theme_profile_options',
                            'oem_theme_sanitize_profile_options' // Here is where all these options get sanitized the same.
                    );
} // end of oem_theme_initialize_profile_options

add_action('admin_init', 'oem_theme_initialize_profile_options');


function oem_profile_options_callback() {
        echo '<p>Provide the URL to the profile networks you\'d like to display</p>';
} // end oem_profile_options_callback

function oem_personal_name_callback() {

        // First, we read the profile options collection
        $options = get_option('oem_theme_profile_options');

        // Next, we need to make sure the elment is defined in the options. If not, we'll set an empty string.
        $url = '';
        if (isset( $options['personal_name'] )) {
                $url = $options['personal_name'];
        }

        // Render the output
        echo '<input type="text" id="personal_name" name="oem_theme_profile_options[personal_name]" value="' . $options['personal_name'] . '" />';
} // end oem_personal_name_callback

Désinfection du texte

function oem_theme_sanitize_profile_options($input) {

        //Define the array for the updated options
        $output = array();

        // Loop through each of the options sanitizing the data
        foreach ($input as $key => $val) {

                if( isset($input[$key]) ) {
                        $output[$key] = strip_tags( stripslashes($input[$key]));
                } // end if
        } // end foreach

        return apply_filters( 'oem_theme_sanitize_profile_options', $output, $input );
} // end oem_theme_sanitize_profile_options
6
chris_s

Au lieu d'utiliser add_settings_section () et add_settings_field () à chaque fois, créez une fonction qui renvoie un tableau d'options, par exemple:

function my_theme_options() {
$options = array();

$options[] = array(
                'id' => 'ID',
                'title' => 'Title',
                'type' => 'text_field', // use this value to sanitize/validate input
                'validate' => 'url' // use this value to validate the text as url
                // add as much as you need like description, default value ...
            );

$options[] = array(
                'id' => 'ID_2',
                'title' => 'Title',
                'type' => 'text_field',
                'validate' => 'email' // use this value to validate the text as email
                // add as much as you need like description, default value ...
            );

// every time you want to add a field you'll use this function an create a new array key $options[] = array();

return $options;

}

en utilisant cette fonction, nous pouvons enregistrer chaque champ avec une boucle foreach qui utilisera add_settings_field ()

maintenant, en utilisant cette fonction, vous pouvez créer une fonction de rappel pour register_setting () et utiliser switch pour valider l'entrée, par exemple:

// this should be the callback function of register_setting() (last argument)
function validate_settings($input) {
$options = my_theme_options(); // we'll set $options variable equal to the array we created in the function before

$valid_input = array(); // this will be the array of the validated settings that will be saved to the db, of course using one array for all options.

foreach ($options as $option) {
    switch ( $option['type'] ) { // $option['type'] where type is the key we set before in my_theme_options()
        case 'text_field':
            // inside we'll create another switch that will use the validate key we created in my_theme_options()
            switch( $option['validate'] ) {
                case 'url':
                    // validate url code

                break;

                case 'email':
                    // validate email
                break;

                // create a default for regular text fields
                default:
                    // default validation
                break;
            }
        break;

        case 'textarea':
            // your validation code here
        break;

        // you get the idea just keep creating cases as much as you need
    }// end switch
}// end foreach

return $valid_input;
}

à la fin de chaque cas pour enregistrer la valeur dans le tableau $ valid_input

$valid_input[$option['id']] = $input[$option['id']]

par exemple pour valider l'utilisation de l'URL:

if ( preg_match('your regex', $input[$option['id']]) ) {
    $valid_input[$option['id']] = $input[$option['id']];
}

vous pouvez également créer une fonction similaire à la fonction options, mais pour les sections et créer une boucle foreach qui utilisera add_settings_section (), vous avez l’idée que cela sera beaucoup plus facile pour vous, vous gagnerez beaucoup de temps plus tard, quand vous le souhaitez. pour ajouter de nouveaux champs et section de paramètres. J'espère que cela pourra aider :)

4
Pierre

Je suppose que je vous renvoie tout d’abord à la section Codex sur Validation des données . Vous y trouverez une multitude de fonctions intégrées utiles pour la désinfection des URL et autres champs de saisie, y compris la vérification d'un courrier électronique valide (is_email ()), même s'il ne le nettoie pas réellement.

Ensuite, puisque vous obtenez un tableau associatif dans $input, pensez à écrire une instruction switch dans oem_theme_sanitize_profile_options() si vous souhaitez isoler certaines entrées à traiter en tant que cas spéciaux.

Envisagez en utilisant add_settings_error () si un champ de saisie (tel que le champ email) est invalide.

0
Tom Auger