Bagaimana cara memasukkan kotak centang di formulir backend widget?

17

Saya mencoba memasukkan kotak centang di ujung belakang widget saya. Tapi saya tidak bisa mendapatkan nilai (hidup atau mati) setelah pengguna mengirimkannya. Saya pikir nilainya akan disimpan dalam "esc_attr ($ check)" (seperti ketika menggunakan input teks), tetapi saya tidak dapat mengambilnya.

Inilah yang saya coba sekarang:

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 
}

Bagaimana saya bisa membuatnya bekerja? Juga bagaimana saya mendapatkan nilai kotak centang di ujung depan?

Lisandro Vaccaro
sumber

Jawaban:

22

Pertama, pada widget fungsi :

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
    // ...
}

Pada pembaruan fungsi :

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;
}

Akhirnya, pada formulir fungsi , tambahkan ini:

<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 -->

EDIT: Mari kita lihat kode lengkap widget 'Tentang Kami' menggunakan kotak centang untuk menampilkan / menyembunyikan gambar avatar:

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' );

Diuji dan bekerja.

Sunting (2015-September-08): Penting! Contoh widget itu menggunakan konstruktor gaya PHP4, namun WordPress 4.3 beralih ke PHP5, jadi Anda juga harus mengganti konstruktornya. Informasi lebih lanjut, di sini .

Jika Anda menggunakan plugin 'tema-cek' Anda akan melihat pemberitahuan menyarankan Anda untuk menggunakan __construct()bukan WP_Widget. Hapus fungsi pertama dan tambahkan yang berikut:

function __construct() {
    parent::__construct(
        'about_us', // Base ID
        __( 'About US', 'wptheme' ), // Name
        array( 'description' => __( 'About Us', 'wptheme' ), ) // Args
    );
}
Gerard
sumber
Ya, saya menggunakannya di widget untuk mengaktifkan / menonaktifkan gambar avatar. Ini bekerja sangat baik untuk saya.
Gerard
Baik. Saya pikir untuk lebih jelas Anda harus menambahkan jawaban penetapan default untuk $instance['your_checkbox_var']pada formulir fungsi.
gmazzap
Tugas default adalah 'avatar' bukan 'your_checkbox_var'. Saya menulis 'your_checkbox_var', sebenarnya, untuk membuatnya lebih jelas. Pokoknya saya akan mengubah jawaban saya dengan contoh default. Terima kasih atas sarannya :)
Gerard
@ Gerard, coba atur avatar secara default dan Anda tidak dapat mematikannya
Benn
Ini bekerja untuk saya ketika saya menggunakan 'on' dan 'off' daripada TRUe dan Falso dalam fungsinya. Saya juga menggunakan cek sederhana untuk pernyataan if .. if ('on' = $ myinstance) {... kode saya ...}
The Skilled Family