วิธีรวมช่องทำเครื่องหมายในรูปแบบแบ็กเอนด์วิดเจ็ต?


17

ฉันกำลังพยายามรวมช่องทำเครื่องหมายในวิดเจ็ตแบ็กเอนด์ของฉัน แต่ฉันไม่สามารถรับค่า (เปิดหรือปิด) หลังจากที่ผู้ใช้ส่ง ฉันคิดว่าค่าจะถูกเก็บไว้ใน "esc_attr ($ check)" (เนื่องจากเมื่อใช้การป้อนข้อความ) แต่ฉันไม่สามารถเรียกคืนได้

นี่คือสิ่งที่ฉันพยายามตอนนี้:

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 
}

ฉันจะทำให้เรื่องนี้ทำงานได้อย่างไร นอกจากนี้ฉันจะรับค่าของช่องทำเครื่องหมายในส่วนหน้าได้อย่างไร

คำตอบ:


22

ก่อนอื่นในวิดเจ็ตของฟังก์ชัน :

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

ในการอัพเดตฟังก์ชั่น :

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

ในที่สุดบนฟอร์มฟังก์ชั่นเพิ่มสิ่งนี้:

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

แก้ไข: เรามาดูรหัสเต็มของวิดเจ็ต 'เกี่ยวกับเรา' โดยใช้ช่องทำเครื่องหมายเพื่อแสดง / ซ่อนภาพประจำตัว:

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

ผ่านการทดสอบและทำงาน

แก้ไข (2015-Sept-08): สำคัญ! ตัวอย่างวิดเจ็ตดังกล่าวใช้ตัวสร้างสไตล์ PHP4 แต่ WordPress 4.3 เปลี่ยนเป็น PHP5 ดังนั้นคุณควรสลับตัวสร้างเช่นกัน ข้อมูลเพิ่มเติมที่นี่

หากคุณใช้ปลั๊กอิน 'รูปแบบการตรวจสอบ' คุณจะเห็นแจ้งให้ทราบล่วงหน้าแนะนำให้คุณใช้แทน__construct() WP_Widgetลบฟังก์ชั่นแรกและเพิ่มหนึ่งต่อไปนี้:

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

ใช่ฉันใช้มันในวิดเจ็ตเพื่อเปิด / ปิดภาพประจำตัว มันใช้งานได้ดีมากสำหรับฉัน
เจอราร์ด

ตกลง. ฉันคิดว่าเพื่อความชัดเจนมากขึ้นคุณควรเพิ่มคำตอบที่ได้รับมอบหมายเริ่มต้นสำหรับ$instance['your_checkbox_var']ในรูปแบบฟังก์ชั่น
gmazzap

การมอบหมายเริ่มต้นคือ 'avatar' แทน 'your_checkbox_var' ฉันเขียน 'your_checkbox_var' เพื่อให้ชัดเจนยิ่งขึ้น อย่างไรก็ตามฉันจะแก้ไขคำตอบของฉันด้วยตัวอย่างเริ่มต้น ขอบคุณสำหรับคำแนะนำ :)
เจอราร์ด

@ เจอราร์ดลองตั้งค่า Avatar เป็นค่าเริ่มต้นและคุณจะไม่สามารถปิดได้
Benn

สิ่งนี้ใช้ได้กับฉันเมื่อฉันใช้ 'เปิด' และ 'ปิด' แทน TRUe และ Falso ฉันยังใช้การตรวจสอบง่าย ๆ สำหรับข้อความสั่ง if .. if ('on' = $ myinstance) {... รหัสของฉัน ... }
ครอบครัวที่มีทักษะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.