I’m currently working on a plugin in which I would like to have a new setting (called ‘show_introduction’) that has the default value ‘true’.
I did this by the following which is hooked into ‘admin_init’
register_setting('tf-song-list-settings-group', 'show_introduction');
if (get_option('show_introduction') == '') update_option('show_introduction', 'true');
On the settings page I have the following to incorporate the above setting into a checkbox
<input name="show_introduction" type="checkbox" id="show_introduction" value="true" <?php checked('true', get_option('show_introduction')); ?> />
Now the problem is that I cannot UNcheck the checkbox and thus set the value to false.
What am I doing wrong, and how is it done right?
If I give the setting ‘false’ by default, all is working nicely. But that’s not what I want the default value to be.
Of course, I could rename the setting from ‘show_introduction’ into ‘hide_introduction’, give the input the value ‘false’, check for ‘false’, and hence do it all the other way around. Most probably, that would work. But that’s more like a workaround to the actual problem, isn’t it?
Thanks in advance.
// edit
I think I got what I wanted. Here’s the 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'))
The clue, I guess, is
A) to use a validation/sanitizing function to set the specific values in case it is not the default value,
and B) to check with (false === MY_OPTIONS) and only then set default values.
Now, I can use the following on my settings page and all is working fine:
<input name="tfsl_options[show_introduction]" type="checkbox" id="tfsl_options[show_introduction]" value="1" <?php checked(1, $options['show_introduction']); ?> />
Thanks for your input!
BTW, if there’s something wacky with my above code, feel free to enlighten me. I didn’t use the settings API until two days ago.
The get_option function has a second parameter that allows you to specify a default value as noted in the documentation here if I am understanding you correctly.
Does this do anything?
Since you asked for my solution as an aswer, here it is.
Firstly, as Chip Bennett pointed out, I had to re-arrange my whole approach to settings and options.
As of now, I ended up using the following code:
On the desired (settings) page, the code snippet for the checkbox is as follows:
If checked, the option is set to 1, and if unchecked, the option is ‘unset’ (i.e. set to ”), what again is ‘validated’ into 0 by means of the validation function. Thus, I can treat the option as boolean, no matter what. The value is either 1 or 0.
That is the exact behavior I was looking for when I asked the question.