如何将新注册的设置与复选框和缺省值‘true’一起使用

时间:2013-02-19 作者:tfrommen

我目前正在开发一个插件,我希望有一个新的设置(称为“show\\u introduction”),默认值为“true”。

我通过连接到“admin\\u init”的以下操作完成了此操作

register_setting(\'tf-song-list-settings-group\', \'show_introduction\');
if (get_option(\'show_introduction\') == \'\') update_option(\'show_introduction\', \'true\');
在设置页面上,我有以下内容可以将上述设置合并到复选框中

<input name="show_introduction" type="checkbox" id="show_introduction" value="true" <?php checked(\'true\', get_option(\'show_introduction\')); ?> />
现在的问题是,我无法取消选中该复选框,从而将该值设置为false。

我做错了什么,怎么做才是对的?

如果我在默认情况下将设置设置为“false”,那么一切都会正常工作。但这不是我想要的默认值。

当然,我可以将设置从“show\\u introduction”重命名为“hide\\u introduction”,给输入值“false”,检查“false”,然后以其他方式进行操作。最有可能的是,这会起作用。但这更像是解决实际问题的方法,不是吗?

提前谢谢。

// edit

我想我得到了我想要的。这是密码

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\'))
我想,线索是A)如果不是默认值,使用验证/清理功能设置特定值,B)检查(false===MY\\u选项),然后才设置默认值。

现在,我可以在设置页面上使用以下内容,一切正常:

<input name="tfsl_options[show_introduction]" type="checkbox" id="tfsl_options[show_introduction]" value="1" <?php checked(1, $options[\'show_introduction\']); ?> />
感谢您的投入!

顺便说一句,如果我上面的代码有什么奇怪的地方,请随时告诉我。直到两天前,我才使用设置API。

2 个回复
最合适的回答,由SO网友:tfrommen 整理而成

既然你问我作为一个aswer的解决方案,就在这里。

首先,正如奇普·贝内特所指出的,我必须重新安排设置和选项的整个方法。

截至目前,我最终使用了以下代码:

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();
在所需的(设置)页面上,复选框的代码段如下所示:

<?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\']); ?> />
如果选中,则该选项设置为1,如果未选中,则该选项为“未设置”(即设置为“”),通过验证函数再次将其“验证”为0。因此,无论发生什么情况,我都可以将该选项视为布尔值。该值为1或0。

这正是我问这个问题时想要的行为。

SO网友:Dwayne Charrington

get\\u option函数还有第二个参数,允许您按照文档中的说明指定默认值here 如果我理解正确的话。

这有什么作用吗?

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

结束