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