设置页面-无法将复选框更改为未选中

时间:2019-05-12 作者:Ryszard Jędraszyk

我认为我的插件设置最终可以使用默认值,而不需要用它们覆盖db,但这只是acau_update_delay 这是数值,不用于复选框。默认情况下,这两个复选框都处于选中状态,不幸的是,当我取消选中它们并保存设置时,它们会再次被选中。

我甚至研究了为什么我不能让它工作,但找不到用我的实现来解决它的方法。问题是数据库中只保存选中的复选框。因此,如果未选中它们,则不会有db条目,例如options[\'acau_cart_notices_off\'] 将丢失,而不是方便的值为0。

因此,我的职能acau_get_settings 将覆盖这些缺失的设置值,每个复选框的默认值为1,而不是将它们单独保留。

我怎样才能修复它?

public function acau_get_settings( $index = false ) {
    $defaults = array ( \'acau_update_delay\' => 1000,\'acau_positive_qty\' => 1,\'acau_cart_notices_off\' => 1 );
    $settings = get_option( \'acau_settings\', $defaults );
    $settings = wp_parse_args( $settings, $defaults );

    if ( $index && isset( $settings[ $index ] ) ) {
        return $settings[ $index ];
    }

    return $settings;
}
我开始像这样创建设置页面,调用函数acau_get_settings:

public function create_settings_page()
{      
    $this->options = $this->acau_get_settings();
以下是复选框设置之一的回调:

public function acau_cart_notices_off_callback() {  
    printf(
    \'<fieldset>
        <label><input id="acau_cart_notices_off" type="checkbox" name="acau_settings[acau_cart_notices_off]" value="1" %1$s />%2$s</label>
    </fieldset>\',   
    isset( $this->options[\'acau_cart_notices_off\'] ) && ( 1 == $this->options[\'acau_cart_notices_off\'] )  ? \'checked="checked" \':\'\',    
    __( \'Turn off notices on cart page. Most common are "Cart updated." and notice about product removed from cart.\', \'ajax-cart-autoupdate\' )      
    );
}

1 个回复
最合适的回答,由SO网友:Ryszard Jędraszyk 整理而成

我做了一些调试,结果发现这一行导致了错误的行为:

$settings = wp_parse_args( $settings, $defaults );
我想知道为什么它在这一行后面,这一行应该也有同样的作用:

$settings = get_option( \'acau_settings\', $defaults );
这两行一行接一行的代码是一位智者编写的,所以我想这可能是某种倒退。看起来只有后者才能正确地用于复选框。

相关推荐