You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义WordPress插件设置无法保存问题求助

解决WordPress Settings API中复选框设置无法保存的问题

你的问题出在复选框字段的实现上,具体有三个关键问题:

  • 复选框的value设置错误,导致勾选时提交的是0,和预期的1不符
  • checked()函数的参数顺序颠倒,无法正确判断选中状态
  • 未处理复选框未勾选时的提交逻辑(未勾选的复选框不会被POST提交,导致设置不会被更新为0)

修正后的完整代码

/* Create Menu */
add_action( 'admin_menu', 'fbm_config_menu' );
function fbm_config_menu() {    
    $page_title = 'Sample Plugin';   
    $menu_title = 'Sample Plugin Config';   
    $capability = 'manage_options';   
    $menu_slug  = 'fbm_config';   
    $function   = 'fbm_config_page';
    add_menu_page( 
        $page_title,                  
        $menu_title,                   
        $capability,                   
        $menu_slug,                   
        $function
    ); 
}

/* Register Settings and Fields */
function fbm_register_settings() {
    // 添加 sanitize 回调处理复选框未勾选的情况
    register_setting( 
        'fbm_config', 
        'fbm_lockout_updates',
        array(
            'sanitize_callback' => 'fbm_sanitize_lockout_setting',
            'default' => '0' // 设置默认值
        )
    );
        
    add_settings_section(
        'fbm_restriction_section',
        'Development Restrictions',
        'fbm_restriction_callback',
        'fbm_config'
    );
        
    add_settings_field(
        'fbm_lockout_updates_field',
        'Lockout Updates',
        'fbm_lockout_field_callback',
        'fbm_config',
        'fbm_restriction_section'
    );
}
add_action( 'admin_init', 'fbm_register_settings' );

/* Settings Callbacks */
function fbm_restriction_callback() {
    ?>
    <p><?php esc_html_e( 'Description of Setting Section', 'fbm_config' ); ?></p>
    <?php
}

function fbm_lockout_field_callback() {
    $setting = get_option('fbm_lockout_updates');
    ?>
    <!-- 修正value为1,调整checked参数顺序 -->
    <input type="checkbox" name="fbm_lockout_updates" value="1" <?php checked( $setting, '1' ); ?> >
    <?php
}

// 新增 sanitize 回调函数
function fbm_sanitize_lockout_setting( $input ) {
    // 如果没有提交值(复选框未勾选),返回0
    return isset( $input ) ? '1' : '0';
}

/* Load Admin Page */
function fbm_config_page(){ 
    if ( isset( $_GET['settings-updated'] ) ) {
        add_settings_error( 'fbm_con_messages', 'fbm_con_message', __( 'Settings Saved', 'fbm_config' ), 'updated' );
    }
    settings_errors( 'fbm_con_messages' );
    ?>

    <div class="wrap">
        <h1><?php echo esc_html( get_admin_page_title() ); ?></h1>

        <form method="post" action="options.php">
            <?php 
                settings_fields( 'fbm_config' );
                do_settings_sections( 'fbm_config' );
                submit_button( 'Save Settings' );
            ?>
        </form>
    </div>
<?php }  
?>

关键修正点说明

  1. 复选框Value修正:将value="0"改为value="1",这样勾选时提交的是预期的开启状态值。
  2. Checked函数参数调整:checked()函数的正确用法是checked( $current_value, $target_value ),所以把原来的checked('1', $setting)改成checked( $setting, '1' ),确保选中状态判断正确。
  3. 添加Sanitize回调:注册设置时添加sanitize_callback,处理复选框未勾选的情况——因为未勾选的复选框不会出现在POST数据中,此时需要手动返回0,确保设置能被正确更新为关闭状态。同时设置default值为0,保证首次加载时有默认值。

内容的提问来源于stack exchange,提问作者Kyler H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:57:17