web-dev-qa-db-fra.com

Comment utiliser un paramètre nouvellement enregistré avec une case à cocher et la valeur par défaut 'true'

Je travaille actuellement sur un plugin dans lequel j'aimerais avoir un nouveau paramètre (appelé 'show_introduction') qui a la valeur par défaut 'true'.

Je l'ai fait par le suivant qui est accroché dans 'admin_init'

register_setting('tf-song-list-settings-group', 'show_introduction');
if (get_option('show_introduction') == '') update_option('show_introduction', 'true');

Sur la page des paramètres, j'ai les éléments suivants pour incorporer le paramètre ci-dessus dans une case à cocher

<input name="show_introduction" type="checkbox" id="show_introduction" value="true" <?php checked('true', get_option('show_introduction')); ?> />

Maintenant, le problème est que je ne peux pas décocher la case et définir la valeur sur false.

Qu'est-ce que je fais mal, et comment fait-il bien?

Si je donne le paramètre 'false' par défaut, tout fonctionne correctement. Mais ce n'est pas ce que je veux que la valeur par défaut soit.

Bien sûr, je pourrais renommer le paramètre "show_introduction" en "hide_introduction", donner à l'entrée la valeur "false", rechercher "false" et le faire à l'inverse. Cela fonctionnerait très probablement. Mais cela ressemble plus à une solution de contournement au problème actuel, n'est-ce pas?

Merci d'avance.

// modifier

Je pense avoir ce que je voulais. Voici le code

if (!class_exists('tf_song_list')) {
    class tf_song_list {
        public function __construct() {
            add_action('admin_init', array(&$this, 'init_options'));
        } // public function __construct

        function init_options() {
            register_setting('tfsl_options', 'tfsl_options', array(&$this, 'validate_options'));
            $options = get_option('tfsl_options');
            if (false === $options)
                $options = $this->get_default_options();
            update_option('tfsl_options', $options);
        } // function init_options

        function get_default_options() {
            $options = array(
                'show_introduction' => 1
            );
            return $options;
        } // function get_default_options

        function validate_options($options) {
            $validated_options['show_introduction'] = ($option = $options['show_introduction']) ? $option : 0;
            return $validated_options;
        } // function validate_options
    } // class tf_song_list
} // if (!class_exists('tf_song_list'))

L’indice, je suppose, est
A) utiliser une fonction de validation/désinfection pour définir des valeurs spécifiques s'il ne s'agit pas de la valeur par défaut,
et B) pour vérifier avec (false === MY_OPTIONS) et seulement ensuite définir les valeurs par défaut.

Maintenant, je peux utiliser les éléments suivants sur ma page de paramètres et tout fonctionne correctement:

<input name="tfsl_options[show_introduction]" type="checkbox" id="tfsl_options[show_introduction]" value="1" <?php checked(1, $options['show_introduction']); ?> />

Merci pour votre contribution!

BTW, s'il y a quelque chose de loufoque avec mon code ci-dessus, n'hésitez pas à m'éclairer. Je n'ai pas utilisé l'API de paramètres il y a deux jours.

1
tfrommen

Puisque vous avez demandé ma solution en réponse, la voici.

Tout d'abord, comme Chip Bennett l'a fait remarquer, j'ai dû réorganiser toute mon approche des paramètres et des options.

À partir de maintenant, j'ai fini par utiliser le code suivant:

class MYClass {
    function __construct() {
        add_action('admin_init', array($this, 'register_settings'));
    }

    function activate() {
        if (false === get_option('MY_options'))
            update_option('MY_options', $this->get_default_options());
    }

    function register_settings() {
        register_setting('MY_options', 'MY_options', array($this, 'validate_options'));
        if (false === ($options = get_option('MY_options')))
            $options = $this->get_default_options();
        update_option('MY_options', $options);
    }

    function get_default_options() {
        $options = array(
            'cb_option' => 1, // the checkbox-option in question
            'option_n' => 'whatever',
            ...
        );
        return $options;
    }

    function validate_options($options) {
        $validated['cb_option'] = (1 === $options['cb_option']) ? 1 : 0;
        $validated['option_n'] = SANITIZE_IN_SOME_WAY($options['title_name']);
        ...
        return $validated;
    }
}

$MYClassObject = new MYClass();

Sur la page souhaitée (paramètres), l'extrait de code correspondant à la case à cocher est le suivant:

<?php $O = get_option('MY_options'); ?>
<input name="MY_options[cb_option]" type="checkbox" id="MY_options[cb_option]" value="1" <?php checked(1, $O['cb_opion']); ?> />

Si cette case est cochée, l'option est définie sur 1 et, si elle est décochée, l'option est "désactivée" (c'est-à-dire définie sur ""), ce qui est à nouveau "validé" dans 0 à l'aide de la fonction de validation. Ainsi, je peux traiter l'option comme booléenne, quoi qu'il arrive. La valeur est 1 ou 0.

C'est le comportement exact que je cherchais lorsque j'ai posé la question.

0
tfrommen

La fonction get_option a un deuxième paramètre qui vous permet de spécifier une valeur par défaut comme indiqué dans la documentation ici si je vous comprends bien.

Est-ce que ça fait quelque chose?

<input name="show_introduction" type="checkbox" id="show_introduction" value="true" <?php checked('true', get_option('show_introduction', 'true')); ?> />
0
Dwayne Charrington