我目前正在开发一个插件,我希望有一个新的设置(称为“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。
最合适的回答,由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。
这正是我问这个问题时想要的行为。