如何使用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
相关产品推荐
相关产品推荐

