使用WordPress Widget API保存复选框值时出现问题

时间:2018-08-23 作者:Bheemsen

我正在学习WordPress小部件API。除了复选框控件外,其他一切看起来都很好。此外checked() 函数让我有点困惑,如果我必须默认复选框未选中,我不知道应该建议什么值。

下面是我正在小部件类包装器中尝试的代码。

public function widget( $args, $instance ) {
  extract( $args );
  $checkbox1 = ! empty( $instance[\'checkbox1\'] ) ? $instance[\'checkbox1\'] : false;
  $checkbox2 = ! empty( $instance[\'checkbox2\'] ) ? $instance[\'checkbox2\'] : false;
  $checkbox3 = ! empty( $instance[\'checkbox3\'] ) ? $instance[\'checkbox3\'] : false;

  echo $args[\'before_widget\'];
  echo "Hello world, just testing this out.";
  echo $args[\'after_widget\'];
}

public function form( $instance ) {

  $defaults = array(
    \'checkbox1\' => true,
    \'checkbox2\' => true,
    \'checkbox3\' => true,
  );

  $instance = wp_parse_args( (array) $instance, $defaults ); 
  ?>

<p>
  <input 
    class="checkbox" 
    id="<?php echo esc_attr( $this->get_field_id( \'checkbox1\' ) ); ?>" 
    name="<?php echo esc_attr( $this->get_field_name( \'checkbox1\' ) ); ?>" 
    type="checkbox" 
    <?php checked( \'1\', $instance[\'checkbox1\'] ); ?> 
    value="1">

  <label for="<?php echo esc_attr( $this->get_field_id( \'checkbox1\' ) ); ?>">
    <?php _e( \'Checkbox #1\', \'test\' ); ?>
  </label> 
</p>

<p>
  <input 
    class="checkbox" 
    id="<?php echo esc_attr( $this->get_field_id( \'checkbox2\' ) ); ?>" 
    name="<?php echo esc_attr( $this->get_field_name( \'checkbox2\' ) ); ?>" 
    type="checkbox" 
    <?php checked( \'1\', $instance[\'checkbox2\'] ); ?> 
    value="1">

  <label for="<?php echo esc_attr( $this->get_field_id( \'checkbox2\' ) ); ?>">
    <?php _e( \'Checkbox #2\', \'test\' ); ?>
  </label> 
</p>

<p>
  <input 
    class="checkbox" 
    id="<?php echo esc_attr( $this->get_field_id( \'checkbox3\' ) ); ?>" 
    name="<?php echo esc_attr( $this->get_field_name( \'checkbox3\' ) ); ?>" 
    type="checkbox" 
    <?php checked( \'1\', $instance[\'checkbox3\'] ); ?> 
    value="1">

  <label for="<?php echo esc_attr( $this->get_field_id( \'checkbox3\' ) ); ?>">
    <?php _e( \'Checkbox #2\', \'test\' ); ?>
  </label> 
</p>

  <?php 
}

public function update( $new_instance, $old_instance ) {

  $instance = $old_instance;

  $instance[\'checkbox1\'] = isset( $new_instance[\'checkbox1\'] ) ? 1 : false;
  $instance[\'checkbox2\'] = isset( $new_instance[\'checkbox2\'] ) ? 1 : false;
  $instance[\'checkbox3\'] = isset( $new_instance[\'checkbox3\'] ) ? 1 : false;

  return $instance;
}
感谢您的时间:)

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

(更新#2)

Here\'s完整小部件class 我之前通过我的评论分享的内容

因为class, 这个checkbox1 字段默认为未选中,而checkbox 默认情况下会选中字段。

(更新#1。请注意,此更新未使用示例代码,但希望此答案是more 比上一个答案更有用。)

首先,checkbox 字段(即。<input type="checkbox">), 您可能已经知道,通常有两个值&mdash;“开”值(如果checkbox 字段已选中,并且有一个“关闭”值(如果字段为not 已选中)。

假设您有一个具有以下默认选项的小部件checkbox 字段:

$defaults = array(
  \'cb1\' => \'yes\',
  \'cb2\' => \'no\',
);
对于这两个字段,“on”值为yes, 而“off”值为no.

然后在小部件选项表单中,显示checkbox 使用以下标记的字段:(other attributes such as id and name are intentionally not included)

<input type="checkbox" value="{A}"<?php checked( \'{B}\', \'{C}\' ); ?>>
在哪里{A}{B} 始终为“开”值,而{C} 是数据库中当前的值$defaults 数组,如果小部件选项尚未更改&mdash;e、 g.小部件刚刚添加到侧栏。

所以如果你看一下(上面的)样本$defaults 阵列:

cb1 默认情况下,字段将被选中,因为默认值是“开”值&mdash;$defaults[\'cb1\']yes.

cb2 字段将是not 默认选中,因为默认值为“关闭”值&mdash;$defaults[\'cb2\']no.

示例小部件class 用于测试checkbox 字段:“我的小部件”

<?php
class MY_Widget extends WP_Widget {

    public function __construct() {
        parent::__construct( \'my_widget\', \'My Widget\', array(
            \'classname\'   => \'my-widget\',
            \'description\' => \'Testing checkbox fields.\',
        ) );
    }

    public function widget( $args, $instance ) {
        echo $args[\'before_widget\'];
            echo \'<pre>\'; var_dump( $instance ); echo \'</pre>\';
        echo $args[\'after_widget\'];
    }

    public function update( $new_instance, $old_instance ) {
        $instance = $old_instance;

        $instance[\'cb1\'] = isset( $new_instance[\'cb1\'] ) ? \'yes\' : \'no\';
        $instance[\'cb2\'] = isset( $new_instance[\'cb2\'] ) ? \'yes\' : \'no\';

        return $instance;
    }

    public function form( $instance ) {
        $instance = wp_parse_args(
            (array) $instance,
            // The default options.
            array(
                \'cb1\' => \'yes\', // checked by default
                \'cb2\' => \'no\',  // not checked by default
            )
        );
        ?>
            <p>
                <input type="checkbox" id="<?php echo $this->get_field_id( \'cb1\' ); ?>" name="<?php echo $this->get_field_name( \'cb1\' ); ?>" value="yes"<?php checked( \'yes\', $instance[\'cb1\'] ); ?>>
                <label for="<?php echo $this->get_field_id( \'cb1\' ); ?>">Checkbox #1</label><br>

                <input type="checkbox" id="<?php echo $this->get_field_id( \'cb2\' ); ?>" name="<?php echo $this->get_field_name( \'cb2\' ); ?>" value="yes"<?php checked( \'yes\', $instance[\'cb2\'] ); ?>>
                <label for="<?php echo $this->get_field_id( \'cb2\' ); ?>">Checkbox #2</label>
            </p>
        <?php
    }
}

结束

相关推荐

Using add_filter() in Widgets

只需查询引用add_filter() 作用您可以在WordPress小部件类中使用此函数吗。Example我有一个带有动态创建代码的小部件,我想将其传递给插件中创建的另一个函数。这能实现吗?<?php /** * Display the actual Widget * * @param Array $args * @param Array $instance */ public function widget($args, $inst