Làm thế nào để bao gồm hộp kiểm trong mẫu phụ trợ?


17

Tôi đang cố gắng bao gồm một hộp kiểm trong phần cuối widget của tôi. Nhưng tôi không thể nhận được giá trị (bật hoặc tắt) sau khi người dùng gửi nó. Tôi nghĩ rằng giá trị sẽ được lưu trữ trong "esc_attr ($ check)" (vì đó là khi sử dụng kiểu nhập văn bản), nhưng tôi không thể truy xuất nó.

Đây là những gì tôi đang cố gắng bây giờ:

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 
}

Làm thế nào tôi có thể làm điều này để làm việc? Ngoài ra làm thế nào để tôi có được giá trị của hộp kiểm ở mặt trước?

Câu trả lời:


22

Đầu tiên, trên widget chức năng :

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

Về cập nhật chức năng :

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

Cuối cùng, trên mẫu hàm , thêm phần này:

<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: Chúng ta hãy xem mã đầy đủ của tiện ích 'Giới thiệu' bằng cách sử dụng hộp kiểm để hiển thị / ẩn hình ảnh đại diện:

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

Đã thử nghiệm và làm việc.

Chỉnh sửa (2015-Tháng Chín-08): Quan trọng! Ví dụ tiện ích đó sử dụng các hàm tạo kiểu PHP4, tuy nhiên WordPress 4.3 chuyển sang PHP5, vì vậy bạn cũng nên chuyển đổi các hàm tạo. Thêm thông tin, ở đây .

Nếu bạn sử dụng plugin 'kiểm tra chủ đề', bạn sẽ thấy một thông báo gợi ý bạn sử dụng __construct()thay vì WP_Widget. Xóa chức năng đầu tiên và thêm chức năng sau:

function __construct() {
    parent::__construct(
        'about_us', // Base ID
        __( 'About US', 'wptheme' ), // Name
        array( 'description' => __( 'About Us', 'wptheme' ), ) // Args
    );
}

Có, tôi sử dụng nó trên một widget để bật / tắt hình đại diện. Nó hoạt động rất tốt cho tôi.
Gerard

Đồng ý. Tôi nghĩ để rõ ràng hơn, bạn nên thêm vào câu trả lời gán mặc định cho $instance['your_checkbox_var']mẫu hàm.
gmazzap

Việc gán mặc định là 'avatar' thay vì 'your_checkbox_var'. Tôi đã viết 'your_checkbox_var', thực sự, để làm điều đó rõ ràng hơn. Dù sao tôi sẽ sửa đổi câu trả lời của tôi với ví dụ mặc định. Cảm ơn bạn đã cho lời khuyên :)
Gerard

@Gerard, hãy thử đặt hình đại diện theo mặc định và bạn sẽ không thể tắt nó
Benn

Điều này hiệu quả với tôi khi tôi sử dụng 'bật' và 'tắt' thay vì TRUe và Falso trong phiên bản. Tôi cũng đã sử dụng một kiểm tra đơn giản cho câu lệnh if .. if ('on' = $ myinstance) {... mã của tôi ...}
Gia đình có tay nghề
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.