如何在Widget后端表单中包含复选框?

时间:2013-08-30 作者:Lisandro Vaccaro

我试图在我的小部件后端包含一个复选框。但在用户提交后,我无法获取值(开或关)。我原以为该值会存储在“esc\\u 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 
}
我怎样才能让它工作?还有,如何获取前端复选框的值?

1 个回复
最合适的回答,由SO网友:Unix 整理而成

首先,打开function widget:

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:

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;
}
最后,在function 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 of your checkbox variable</label>
</p>
<!-- Remember to change \'your_checkbox_var\' for your custom ID, as well -->
EDIT:让我们看看“关于我们”小部件的完整代码,使用复选框显示/隐藏化身图像:

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\' );
测试和工作。

Edit (2015-Sept-08): Important! 该小部件示例使用PHP4样式的构造函数,但是WordPress 4.3会切换到PHP5,因此您也应该切换构造函数。更多信息,here.

如果你使用“主题检查”插件,你会看到一个通知,建议你使用__construct() 而不是WP_Widget. 删除第一个函数并添加以下函数:

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

结束

相关推荐

将外部PHP文件包含到WordPress自定义模板中

是否可以将外部PHP文件包含到自定义模板中?我正在尝试将博客添加到我的网站。我的站点中已经有页眉、页脚和侧栏布局。我可以在自定义模板中使用它们吗?<?php /* Template Name: Blog */ ?> <?php include( PATH . \'http://www.example.com/includes/header.php\' ); ?> <?php if (have_posts()) : while