Jak dołączyć pole wyboru do formularza zaplecza widżetu?

17

Próbuję dołączyć pole wyboru do zaplecza mojego widgetu. Ale nie mogę uzyskać wartości (włączenia lub wyłączenia) po przesłaniu jej przez użytkownika. Myślałem, że wartość zostanie zapisana w „esc_attr ($ check)” (tak jak w przypadku wprowadzania tekstu), ale nie mogę jej odzyskać.

Właśnie tego próbuję teraz:

public function form( $instance ) {
    $check = isset( $instance[ 'check' ] ) ? $instance[ 'check' ] : 'off';
    echo esc_attr( $check ); // If the input is type text it outputs the value
    ?>
    <input class="widefat" id="<?php echo $this->get_field_id( 'check' ); ?>" name="<?php echo $this->get_field_name( 'check' ); ?>" type="checkbox" />
    <?php 
}

Jak mogę to uruchomić? Jak również uzyskać wartość pola wyboru w interfejsie?

Lisandro Vaccaro
źródło

Odpowiedzi:

22

Po pierwsze, na widżecie funkcji :

function widget( $args, $instance ) {
    extract( $args );
    // Add this line
    $your_checkbox_var = $instance[ 'your_checkbox_var' ] ? 'true' : 'false';
    // Change 'your_checkbox_var' for your custom ID
    // ...
}

Przy aktualizacji funkcji :

function update( $new_instance, $old_instance ) {
    $instance = $old_instance;
    // Add this line
    $instance[ 'your_checkbox_var' ] = $new_instance[ 'your_checkbox_var' ];
    // Change 'your_checkbox_var' for your custom ID
    // ...
    return $instance;
}

Na koniec w formularzu funkcji dodaj to:

<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 of your checkbox variable</label>
</p>
<!-- Remember to change 'your_checkbox_var' for your custom ID, as well -->

EDYCJA: Zobaczmy pełny kod widżetu „O nas” za pomocą pola wyboru, aby pokazać / ukryć obraz awatara:

class about_us extends WP_Widget {

function about_us() {
    $widget_ops = array( 'classname' => 'about_us', 'description' => __( 'About Us', 'wptheme' ) );
    $this->WP_Widget( 'about_us', __( 'About Us', 'wptheme' ), $widget_ops, $control_ops );
}

function widget( $args, $instance ) {
    extract( $args );
    $title = apply_filters( 'widget_title', $instance[ 'title' ] );
    $text = $instance[ 'text' ];
    // The following variable is for a checkbox option type
    $avatar = $instance[ 'avatar' ] ? 'true' : 'false';

    echo $before_widget;

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

        // Retrieve the checkbox
        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' ] );
    // The update for the variable of the checkbox
    $instance[ 'avatar' ] = $new_instance[ 'avatar' ];
    return $instance;
}

function form( $instance ) {
    $defaults = array( 'title' => __( 'About Us', 'wptheme' ), 'avatar' => 'off' );
    $instance = wp_parse_args( ( array ) $instance, $defaults ); ?>
    <p>
        <label for="<?php echo $this->get_field_id( 'title' ); ?>">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>
    <!-- The checkbox -->
    <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' ); ?>">Show avatar</label>
    </p>
    <p>
        <label for="<?php echo $this->get_field_id( 'text' ); ?>">About Us</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' );

Testowane i działające.

Edycja (2015-wrzesień-08): Ważne! Ten przykład widgetu używa konstruktorów w stylu PHP4, jednak WordPress 4.3 przełącza się na PHP5, więc powinieneś również przełączyć konstruktory. Więcej informacji tutaj .

Jeśli używasz wtyczki „sprawdzanie motywu”, zobaczysz powiadomienie sugerujące użycie __construct()zamiast WP_Widget. Usuń pierwszą funkcję i dodaj następującą:

function __construct() {
    parent::__construct(
        'about_us', // Base ID
        __( 'About US', 'wptheme' ), // Name
        array( 'description' => __( 'About Us', 'wptheme' ), ) // Args
    );
}
Gerard
źródło
Tak, używam go w widżecie, aby włączyć / wyłączyć obraz awatara. Działa dla mnie bardzo dobrze.
Gerard
Dobrze. Myślę, że dla większej przejrzystości powinieneś dodać w odpowiedzi domyślne przypisanie dla $instance['your_checkbox_var']formularza funkcji.
gmazzap
Domyślne przypisanie to „awatar” zamiast „twoja_prawka_okresowa”. Napisałem „your_checkbox_var”, żeby zrobić to dla większej przejrzystości. W każdym razie zmodyfikuję swoją odpowiedź domyślnym przykładem. Dziękuję za radę :)
Gerard
@ Gerard, spróbuj domyślnie włączyć awatar, ale nie będziesz mógł go wyłączyć
Benn
To zadziałało dla mnie, kiedy użyłem „on” i „off” zamiast TRUe i Falso w funkcji. Użyłem również prostego sprawdzenia instrukcji if. If ('on' = $ myinstance) {... mój kod ...}
The Skilled Family