Как использовать чекбоксы и радиокнопки на странице настроек?
Назовите меня глупым, но я не могу понять, как это сделать. Для текстового поля я бы просто использовал:
<input type="text" name="option_name" value="<?php echo get_option('option_name'); ?>" />
и затем подключил бы его к WordPress используя register_setting()
. После этого я мог бы получить его значение через get_option('option_name')
. Как мне сделать то же самое с чекбоксами и радиокнопками?

Чекбокс:
<input name="option_name" type="checkbox" value="1" <?php checked( '1', get_option( 'option_name' ) ); ?> />
Радио-кнопка:
<input name="option_name" type="radio" value="0" <?php checked( '0', get_option( 'option_name' ) ); ?> />
<input name="option_name" type="radio" value="1" <?php checked( '1', get_option( 'option_name' ) ); ?> />

Я предпочитаю хранить несколько настроек в виде массива, поэтому у меня обычно выглядит так:
<?php $options = get_option( 'myoption' ); ?>
<input type="checkbox" name="myoption[option_one]" value="1"<?php checked( 1 == $options['option_one'] ); ?> />
<input type="checkbox" name="myoption[option_two]" value="1"<?php checked( 1 == $options['option_two'] ); ?> />
Однако это зависит от того, как функция обратного вызова, которая санирует входящие данные, обрабатывает сохранённое значение (эту функцию следует определять как третий параметр register_setting
). Лично при работе с флажками я не устанавливаю ключ массива, тогда как другие могут установить ключ в 0 (или другое значение)...
Поэтому мой код обычно выглядит так:
<?php $options = get_option( 'myoption' ); ?>
<input type="checkbox" name="myoption[option_one]" value="1"<?php checked( isset( $options['option_one'] ) ); ?> />
<input type="checkbox" name="myoption[option_two]" value="1"<?php checked( isset( $options['option_two'] ) ); ?> />
Если я работаю только с флажками, функция санации будет выглядеть примерно так:
public function on_option_save( $options ) {
if( !is_array( $options ) || empty( $options ) || ( false === $options ) )
return array();
$valid_names = array_keys( $this->defaults );
$clean_options = array();
foreach( $valid_names as $option_name ) {
if( isset( $options[$option_name] ) && ( 1 == $options[$option_name] ) )
$clean_options[$option_name] = 1;
continue;
}
unset( $options );
return $clean_options;
}
Этот код взят из одного из моих классов плагинов (плагин только с флажками), но не ожидайте, что он заработает, если скопируете его — он здесь только для иллюстрации.
Для радиокнопок, если не используется множественный выбор, это выглядит примерно так:
<?php $options = get_option( 'my_option' ); ?>
<input type="radio" name="myoption[option_three]" value="value1"<?php checked( 'value1' == $options['option_three'] ); ?> />
<input type="radio" name="myoption[option_three]" value="value2"<?php checked( 'value2' == $options['option_three'] ); ?> />
ПРИМЕЧАНИЕ: Конечно, было бы разумно проверить, установлен ли ключ, прежде чем сравнивать его значение (я опустил это для краткости).
Помогло ли вышеизложенное? Если нет, дайте знать, что нужно уточнить (или что я упустил)...
По поводу: checked()
Вы можете найти определение этой функции (в WordPress) здесь: http://core.trac.wordpress.org/browser/tags/3.0.2/wp-includes/general-template.php#L2228
Первый параметр — это условное выражение, а второй параметр (если вы хотите его определить) — это значение для сравнения. Значение по умолчанию для сравнения — TRUE... так что если я сделаю checked( 1 == 1, true )
, я проверю, равно ли 1 == 1 значению true. Если условие выполняется, то возвращается checked="checked"
...
ПРИМЕЧАНИЕ: Я плохо объясняю, так что если вышеизложенное требует уточнений, я не обижусь... просто дайте знать... ;)

Мой мозг сейчас не работает, потому что я расстроен, что не смог разобраться в этом сам. Не могли бы вы объяснить, что делает checked( 1 == $options['option_one']
? Является ли checked()
функцией PHP, потому что я не смог найти её в документации.

Не могу объяснить в комментарии, скоро обновлю свой ответ, смотри выше.. ;)

Ааа! Большое спасибо за помощь! Функция checked()
- единственная, которую я не смог найти через Google, потому что, оказывается, она не задокументирована. Я так привык получать именно то, что хочу, когда ищу "термин + wordpress". :-)

Для уточнения, первый параметр — это что проверять, второй — с чем сравнивать первое значение... так что вы можете сделать, например, так... checked( 1, 2 )
чтобы проверить, равно ли 1 значению 2 ... что не выведет ничего, так как эта функция специально предназначена для вывода состояния checked для чекбоксов или радио-кнопок.. в любом случае, рад помочь... ;)
