Как использовать чекбоксы и радиокнопки на странице настроек?

7 дек. 2010 г., 17:08:12
Просмотры: 69.1K
Голосов: 21

Назовите меня глупым, но я не могу понять, как это сделать. Для текстового поля я бы просто использовал:

<input type="text" name="option_name" value="<?php echo get_option('option_name'); ?>" />

и затем подключил бы его к WordPress используя register_setting(). После этого я мог бы получить его значение через get_option('option_name'). Как мне сделать то же самое с чекбоксами и радиокнопками?

0
Все ответы на вопрос 2
4
35

Чекбокс:

<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' ) ); ?> />
7 дек. 2010 г. 18:09:18
Комментарии

В вашем коде опечатка (тип)...

t31os t31os
7 дек. 2010 г. 18:20:23

Вы дали прямой ответ на вопрос, так что от меня вам +1 ... ;)

t31os t31os
7 дек. 2010 г. 19:21:10

Это должен быть ответ.

User User
20 июн. 2013 г. 16:28:22

Вот оно! Решено, должно быть правильным ответом.

mircobabini mircobabini
7 февр. 2017 г. 15:44:43
4
33

Я предпочитаю хранить несколько настроек в виде массива, поэтому у меня обычно выглядит так:

<?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"...

ПРИМЕЧАНИЕ: Я плохо объясняю, так что если вышеизложенное требует уточнений, я не обижусь... просто дайте знать... ;)

7 дек. 2010 г. 17:35:23
Комментарии

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

Joann Joann
7 дек. 2010 г. 18:24:40

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

t31os t31os
7 дек. 2010 г. 18:29:27

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

Joann Joann
7 дек. 2010 г. 18:53:09

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

t31os t31os
7 дек. 2010 г. 19:05:45