正确使用WordPress的勾选功能

时间:2017-08-03 作者:The WP Intermediate

在公共职能部门Update 此代码位于→

`public function update($new_instance, $old_instance)

      $instance[\'description_box\'] = $new_instance[\'description_box\'];
在公共函数小部件中,此代码位于→

public function widget($args, $instance) {

    $description_box = $instance[ \'description_box\' ] ? \'true\' : \'false\';
在公共职能部门→

public function form( $instance ) {
此代码位于→

<p> <input class="checkbox" type="checkbox" <?php checked( $instance[ \'description_box\' ], \'on\' ); ?> id="<?php echo $this->get_field_id( \'description_box\' ); ?>" name="<?php echo $this->get_field_name( \'description_box\' ); ?>" />
        <label for="<?php echo $this->get_field_id( \'description_box\' ); ?>">Check whether to display description or not</label>
        </p>
现在我想要的是,当条件为真时,即选中该框,然后执行一些代码。

If ($description_box is true) {
<p>some text</p>

}
如何使用→https://codex.wordpress.org/Function_Reference/checked

使现代化→

我试过用这个→

<?php if($description_box==0){ ?>
                                    <p><</p>
                                    <?php } ?>
但问题是,如果小部件位于两个不同的侧栏中,在一个复选框中勾选,在另一个复选框中不勾选,但在两个侧栏中的结果都是相同的,即它要么显示<p></p> 或者不基于$description_box 在中设置为0/1或真/假php if condition. 有什么补救办法?

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

现在,根据您的完整代码,有3个问题:

代码的第60行缺少分号,并引发致命错误。因此:

$instance[\'description_check_box\'] = $new_instance[\'description_check_box\'] 
应为:

$instance[\'description_check_box\'] = $new_instance[\'description_check_box\']; 
在第66行,您使用的是字符串,而不是正确的布尔值truefalse 价值观如果这些都是“真实的”(参见this answer 对于这意味着什么的另一个问题),双方都将解决true 如果在if语句中使用。if (\'false\')true. 因此:

$description_check_box = $instance[ \'description_check_box\' ] ? \'true\' : \'false\';
应为:

$description_check_box = $instance[ \'description_check_box\' ] ? true : false;
在121号线上你没有on 在引号中,所以你在比较$description_check_box 至常数on. 如果要检查$description_check_boxon. 因此:

<?php if($description_check_box==on){ ?>
应为:

<?php if($description_check_box==\'on\'){ ?>
但是。这仍然行不通。因为你会$description_check_boxtruefalse 根据是否在第66行检查,但稍后您将检查该值是否为\'on\'.

您需要设置$description_check_box\'on\', 或者将比较改为检查$description_check_boxtrue.

您还应该使用isset() 使用前$instance[\'description_check_box\'], 否则,当启用WP\\u调试时,您将在customiser中得到一个未定义的索引通知。

关于我的方法,请参考我的另一个答案,它避免了所有这些问题。

SO网友:Jacob Peattie

下面是一个简单小部件的完整实现,其中包含一个复选框,用于隐藏/显示前端的内容:

class Checkbox_Widget extends WP_Widget {
    public function __construct() {
        parent::__construct(
            \'checkbox-widget\',
            \'Checkbox widget\',
            array(
                \'classname\' => \'widget_checkbox\',
            )
        );
    }

    public function widget($args, $instance) {
        $checkbox = isset( $instance[\'checkbox\'] ) ? $instance[\'checkbox\'] : false;

        $args[\'before_widget\'];

        if ( $checkbox === \'on\' ) {
            echo \'I\\\'m checked!\';
        }

        $args[\'after_widget\'];
    }

    public function form( $instance ) {
        $checkbox = isset( $instance[\'checkbox\'] ) ? $instance[\'checkbox\'] : false;
        ?>

        <p><input type="checkbox" id="<?php echo $this->get_field_id( \'checkbox\' ); ?>" name="<?php echo $this->get_field_name( \'checkbox\' ); ?>" <?php checked( $checkbox, \'on\' ); ?>>

        <?php
    }

    public function update( $new_instance, $old_instance ) {
        $new_instance[\'checkbox\'] = $new_instance[\'checkbox\'] === \'on\' ? \'on\' : false;

        return $new_instance;
    }
}
根据您对我的评论的回答,我认为您的错误在于没有正确获取复选框的当前值。在我的示例中,请参见$instance[\'checkbox\'] 正在设置为on 如果它被选中,然后在小部件中我检查它是否等于on 输出时。

结束