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

如何使用WordPress设置API保存数组数据至数据库

嘿,我也碰到过类似的WordPress设置API数组保存问题,给你捋捋怎么解决~

首先你要明确:当my_plugin_options[mode]是一个数组(比如['high','low']这种索引数组,或者关联数组)时,你的写法本身没问题,但大概率是选项注册时的配置没做好,或者表单元素的类型不匹配导致的。

1. 先确保注册选项时支持数组类型

WordPress的register_setting默认可能不会很好地处理数组,所以你需要指定正确的sanitize_callback和默认值:

// 注册设置组和选项
register_setting(
    'my_plugin_settings_group', // 设置组名称,要和你的settings_fields对应
    'my_plugin_options',
    array(
        'sanitize_callback' => 'my_plugin_sanitize_options', // 自定义清理函数
        'default' => array() // 必须设为空数组作为默认,避免后续取数组报错
    )
);

// 自定义的选项清理函数,专门处理数组结构
function my_plugin_sanitize_options($input) {
    $sanitized = array();
    
    // 处理mode数组:如果是索引数组(比如多选的high/low)
    if (isset($input['mode']) && is_array($input['mode'])) {
        // 只保留允许的值,避免恶意数据
        $allowed_values = array('high', 'low');
        $sanitized['mode'] = array_intersect($input['mode'], $allowed_values);
    }
    
    // 如果是关联数组(比如mode里是key-value对,比如['high' => '开启', 'low' => '关闭'])
    // 可以这样处理:
    // if (isset($input['mode']['high'])) {
    //     $sanitized['mode']['high'] = sanitize_text_field($input['mode']['high']);
    // }
    // if (isset($input['mode']['low'])) {
    //     $sanitized['mode']['low'] = sanitize_text_field($input['mode']['low']);
    // }
    
    return $sanitized;
}

2. 表单元素的正确写法分两种情况

情况A:mode是多选的索引数组(比如同时选high和low)

这时候你需要用multiple的select,或者多个复选框,而且name属性要加[]来告诉PHP这是数组:

<!-- 多选select的写法 -->
<select name="my_plugin_options[mode][]" multiple size="2">
    <option value="high" <?php selected(in_array('high', get_option('my_plugin_options')['mode'] ?? array())); ?>>High</option>
    <option value="low" <?php selected(in_array('low', get_option('my_plugin_options')['mode'] ?? array())); ?>>Low</option>
</select>

<!-- 或者用复选框的写法 -->
<label>
    <input type="checkbox" name="my_plugin_options[mode][]" value="high" <?php checked(in_array('high', get_option('my_plugin_options')['mode'] ?? array())); ?>> High
</label>
<label>
    <input type="checkbox" name="my_plugin_options[mode][]" value="low" <?php checked(in_array('low', get_option('my_plugin_options')['mode'] ?? array())); ?>> Low
</label>

情况B:mode是关联数组(比如['high' => '某个值', 'low' => '另一个值'])

这时候你原来的写法my_plugin_options[mode][high]是对的,但要确保输入框的value正确读取已保存的值:

<!-- 比如high对应的输入框 -->
<input type="text" 
       name="my_plugin_options[mode][high]" 
       value="<?php echo esc_attr(get_option('my_plugin_options')['mode']['high'] ?? ''); ?>"
       placeholder="High模式设置">

<!-- low对应的输入框 -->
<input type="text" 
       name="my_plugin_options[mode][low]" 
       value="<?php echo esc_attr(get_option('my_plugin_options')['mode']['low'] ?? ''); ?>"
       placeholder="Low模式设置">

3. 调试小技巧

如果还是没生效,可以在my_plugin_sanitize_options函数里加一行调试代码,看看提交过来的数据是什么样的:

function my_plugin_sanitize_options($input) {
    var_dump($input); // 打印提交的数据
    die; // 终止执行,查看结果
    // ... 剩下的清理逻辑
}

这样你就能知道表单是否正确传递了数组,再针对性调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:34:09