Как включить чекбокс в форму виджета в админке?

30 авг. 2013 г., 17:40:35
Просмотры: 23.2K
Голосов: 21

Я пытаюсь добавить чекбокс в админку моего виджета. Но я не могу получить значение (включено или выключено) после того, как пользователь его отправляет. Я думал, что значение будет храниться в "esc_attr( $check )" (как это происходит при использовании текстового поля), но я не могу его получить.

Вот что я пытаюсь сделать сейчас:

public function form( $instance ) {
    $check = isset( $instance[ 'check' ] ) ? $instance[ 'check' ] : 'off';
    echo esc_attr( $check ); // Если input имеет тип text, он выводит значение
    ?>
    <input class="widefat" id="<?php echo $this->get_field_id( 'check' ); ?>" name="<?php echo $this->get_field_name( 'check' ); ?>" type="checkbox" />
    <?php 
}

Как можно заставить это работать? И как получить значение чекбокса во фронтенде?

0
Все ответы на вопрос 1
5
25

Сначала, в функции widget:

function widget( $args, $instance ) {
    extract( $args );
    // Добавьте эту строку
    $your_checkbox_var = $instance[ 'your_checkbox_var' ] ? 'true' : 'false';
    // Замените 'your_checkbox_var' на ваш собственный ID
    // ...
}

В функции update:

function update( $new_instance, $old_instance ) {
    $instance = $old_instance;
    // Добавьте эту строку
    $instance[ 'your_checkbox_var' ] = $new_instance[ 'your_checkbox_var' ];
    // Замените 'your_checkbox_var' на ваш собственный ID
    // ...
    return $instance;
}

Наконец, в функции form, добавьте следующее:

<p>
    <input class="checkbox" type="checkbox" <?php checked( $instance[ 'your_checkbox_var' ], 'on' ); ?> id="<?php echo $this->get_field_id( 'your_checkbox_var' ); ?>" name="<?php echo $this->get_field_name( 'your_checkbox_var' ); ?>" /> 
    <label for="<?php echo $this->get_field_id( 'your_checkbox_var' ); ?>">Название для вашего чекбокса</label>
</p>
<!-- Не забудьте заменить 'your_checkbox_var' на ваш собственный ID -->

РЕДАКТИРОВАНИЕ: Рассмотрим полный код виджета 'О нас', использующего чекбокс для отображения/скрытия аватара:

class about_us extends WP_Widget {

function about_us() {
    $widget_ops = array( 'classname' => 'about_us', 'description' => __( 'О нас', 'wptheme' ) );
    $this->WP_Widget( 'about_us', __( 'О нас', 'wptheme' ), $widget_ops, $control_ops );
}

function widget( $args, $instance ) {
    extract( $args );
    $title = apply_filters( 'widget_title', $instance[ 'title' ] );
    $text = $instance[ 'text' ];
    // Следующая переменная предназначена для типа опции чекбокса
    $avatar = $instance[ 'avatar' ] ? 'true' : 'false';

    echo $before_widget;

        if ( $title ) {
            echo $before_title . $title . $after_title;
        }

        // Получаем значение чекбокса
        if( 'on' == $instance[ 'avatar' ] ) : ?>
            <div class="about-us-avatar">
                <?php echo get_avatar( get_the_author_meta( 'user_email' ), '50', '' ); ?>
            </div>
        <?php endif; ?>

        <div class="textwidget">
            <p><?php echo esc_attr( $text ); ?></p>
        </div>

        <?php 
    echo $after_widget;
}

function update( $new_instance, $old_instance ) {
    $instance = $old_instance;
    $instance[ 'title' ] = strip_tags( $new_instance[ 'title' ] );
    $instance[ 'text' ] = strip_tags( $new_instance[ 'text' ] );
    // Обновление переменной чекбокса
    $instance[ 'avatar' ] = $new_instance[ 'avatar' ];
    return $instance;
}

function form( $instance ) {
    $defaults = array( 'title' => __( 'О нас', 'wptheme' ), 'avatar' => 'off' );
    $instance = wp_parse_args( ( array ) $instance, $defaults ); ?>
    <p>
        <label for="<?php echo $this->get_field_id( 'title' ); ?>">Заголовок</label>
        <input class="widefat"  id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $instance[ 'title' ] ); ?>" />
    </p>
    <!-- Чекбокс -->
    <p>
        <input class="checkbox" type="checkbox" <?php checked( $instance[ 'avatar' ], 'on' ); ?> id="<?php echo $this->get_field_id( 'avatar' ); ?>" name="<?php echo $this->get_field_name( 'avatar' ); ?>" /> 
        <label for="<?php echo $this->get_field_id( 'avatar' ); ?>">Показывать аватар</label>
    </p>
    <p>
        <label for="<?php echo $this->get_field_id( 'text' ); ?>">О нас</label>
        <textarea class="widefat" id="<?php echo $this->get_field_id( 'text' ); ?>" rows="10" cols="10" name="<?php echo $this->get_field_name( 'text' ); ?>"><?php echo esc_attr( $instance[ 'text' ] ); ?></textarea>
    </p>
<?php
}

}
register_widget( 'about_us' );

Протестировано и работает.

Редактирование (2015-Сент-08): Важно! Этот пример виджета использует конструкторы в стиле PHP4, однако WordPress 4.3 переходит на PHP5, поэтому вам также следует переключить конструкторы. Больше информации здесь.

Если вы используете плагин 'theme-check', вы увидите уведомление, предлагающее использовать __construct() вместо WP_Widget. Удалите первую функцию и добавьте следующую:

function __construct() {
    parent::__construct(
        'about_us', // Базовый ID
        __( 'О нас', 'wptheme' ), // Название
        array( 'description' => __( 'О нас', 'wptheme' ), ) // Аргументы
    );
}
2 сент. 2013 г. 16:29:27
Комментарии

Да, я использую его в виджете для включения/отключения аватарки. Он отлично работает у меня.

Unix Unix
2 сент. 2013 г. 19:25:39

Хорошо. Думаю, для большей ясности вам стоит добавить в ответ значение по умолчанию для $instance['your_checkbox_var'] в функции form.

gmazzap gmazzap
2 сент. 2013 г. 19:55:27

Значение по умолчанию - 'avatar' вместо 'your_checkbox_var'. Я написал 'your_checkbox_var' на самом деле для большей понятности. В любом случае, я изменю свой ответ, добавив пример по умолчанию. Спасибо за совет :)

Unix Unix
2 сент. 2013 г. 20:20:52

@Gerard, попробуйте установить аватар включенным по умолчанию, и вы не сможете его отключить

Benn Benn
6 мар. 2017 г. 17:19:46

Это сработало у меня, когда я использовал 'on' и 'off' вместо TRUE и FALSE в функции. Также я использовал простое условие в if: if ('on' == $myinstance) { ...мой код... }

DJ_Davey DJ_Davey
6 апр. 2019 г. 21:40:57