J'utilise les paramètres de l'API et je ne parviens pas à faire fonctionner les cases à cocher. Si elles sont définies sur "false", elles ne sont même pas $ _POST et c'est ce qui compte.
Stephen Harris & Chip Bennett a expliqué , mais je crois que leur façon de faire n'est pas assez simple (surtout pour moi, pas du tout PHP-guy). Ai-je VRAIMENT besoin de quelques fonctions PHP personnalisées et de boutons de soumission personnalisés pour chaque formulaire afin que cette simple opération fonctionne?
Mes paramètres ressemblent beaucoup à:
register_setting('XX_theme_settings', 'XX_theme_settings', 'setting_validate' );
add_settings_section('theme_options', 'Theme Options', 'theme_options_generate', 'page1' );
add_settings_field( 'XX_Option1', 'Option 1', 'checkbox', 'page1', 'theme_options', 'XX_Option1', $args = array('id' => 'checkbox1', 'type' => 'checkbox') );
add_settings_field( 'XX_Option2', 'Option 2', 'checkbox', 'page1', 'theme_options', 'XX_Option2', $args = array('id' => 'checkbox2', 'type' => 'checkbox') );
Ensuite, je génère des cases à cocher avec cette fonction de rappel:
function checkbox($args) {
$options = get_option('XX_theme_settings');
echo '<input type="checkbox" name="'. $args['id'] .'" value="true"'; if($options[$args['id']]==true) { echo 'checked="checked'; }; echo '/>';
echo $args['type'];
}
Maintenant, tout ce dont j'ai besoin est un bon rappel de rappel:
function setting_validate($input) {
// Firstly it should find all fields of type == "checkbox"
// (I'm not sure why should I check which field was just being sent,
// is updating all the checkboxes from different sections a big no-no?
// it is much easier indeed.
// Now set the ones missing to false/0 and the rest to true/1.
// Then merge everything like below:
$options = get_option('XX_theme_settings');
$merged = array_merge($options, $input);
return $merged;
}
La question est donc la suivante: Comment répertorier toutes les cases à cocher Paramètres Api, puis définir celles qui conviennent sur true?
Je suppose que cela ressemblerait à quelque chose comme ça:
$options = array(
array(
'id' => 'checkbox1',
'type' => 'checkbox',
'page' => 'page1',
),
array(
'id' => 'checkbox2',
'type' => 'checkbox',
'page' => 'page1',
),
);
function setting_validate($input) {
foreach($options as $option) {
if($option['type'] == "checkbox") {
//set it to 1 if sent
}
}
$options = get_option('XX_theme_settings');
$merged = array_merge($options, $input);
return $merged;
}
Merci :)
Voici comment Chip Bennett le fait exactement , mais même avec tous ces excellents commentaires, je ne comprends pas comment cela fonctionne.
Si le paramètre en question est $setting
et qu'il s'agit d'un type de case à cocher, vous le validez comme suit:
<?php
$valid_input[$setting] = ( isset( $input[$setting] ) && true == $input[$setting] ? true : false );
?>
Dans ce cas, $input
correspond aux données de formulaire transmises au rappel de validation , où $input
correspond à un tableau de tableaux. La méthode de validation est appelée whitelisting , où le tableau de paramètres actuel est appelé (dans ce cas, sous la forme $valid_input
), et chaque paramètre du tableau de paramètres n’est mis à jour que si la valeur $input[$setting]
passe la validation.
Avec les cases à cocher, si la case à cocher n'est pas set , le paramètre lui-même n'est pas renseigné dans le tableau $input
. Donc, la première étape pour le valider consiste à déterminer s'il a été défini dans $input
. La deuxième étape consiste à vérifier que la valeur définie est true
(ou 'true'
ou 'on'
, ou à quoi que ce soit pour lequel vous définissez la valeur de case à cocher dans le formulaire des paramètres). Si ces deux conditions sont remplies, retournez true
; sinon, retournez false
.
Voir: c'est assez simple, vraiment. :)
À ce sujet:
function setting_validate($input) {
foreach($options as $option) {
if($option['type'] == "checkbox") {
//set it to 1 if sent
}
}
$options = get_option('XX_theme_settings');
$merged = array_merge($options, $input);
return $merged;
}
... ce n'est pas exactement la façon dont vous voulez le faire. Vous voulez limiter la valeur de retour à valid options; c’est-à-dire que vous souhaitez renvoyer explicitement les paramètres que vous savez avoir définis. Si, d'une manière ou d'une autre, quelqu'un peut remplir $input
avec des données supplémentaires - c'est-à-dire un code malveillant - votre méthode transmettrait simplement ces données supplémentaires à la base de données .
Ne faites pas de array_merge()
. Mettez à jour chaque $valid_options[$setting]
séparément/individuellement et ne renvoyez jamais que $valid_options
.
Voici le processus:
Définissez le actuellement valide data:
$valid_input = get_option( 'XX_theme_settings' );
$input
uniquement si $input
réussit votre validation/désinfection.Si les champs sont générés dynamiquement, vous devez également les parcourir pas à pas dynamiquement, dans votre rappel de validation. Vous avez ceci correct, avec foreach( $options as $option )
.
Cela pourrait ressembler à ceci:
<?php
function setting_validate( $input ) {
// Get current setting values
$valid_options = get_option( 'XX_theme_options' );
// Get option parameters array
// Note: XX_theme_get_option_parameters() function
// should be defined to return the array you've
// defined for $options
$options = XX_theme_get_option_parameters();
// Now step through the option parameters,
// and validate each $input[$option]
foreach( $options as $option ) {
// If $option['type] is a checkbox
if( 'checkbox' == $option['type'] ) {
// verify that $input[$option] is set
// and is set with a valid value;
// if so, set $valid_input[$option] to 1
$valid_input[$option] = ( isset( $input[$option] && true == $input[$option] ? 1 : 0 );
}
}
// Return the updated $valid_input array
return $valid_input;
}
?>