WordPress插件如何实现同一设置字段存储多组分类折扣配置
实现多组分类折扣配置存储方案
核心调整思路
- 将原单值存储改为二维数组结构存储,每个子元素对应一组「分类别名+折扣比例」配置
- 表单字段名修改为数组格式,提交时WordPress会自动解析为数组结构
- 在配置 sanitize 回调中处理数据,将新提交的配置追加到原有配置数组中,避免覆盖旧数据
1 修改字段渲染函数
同时输出已有配置列表+新增配置的输入框:
function cat_discount_render() { $options = get_option( 'slug-configuration', [] ); // 先输出已保存的所有配置 if ( ! empty( $options ) ) { echo '<h4>已保存的配置:</h4>'; echo '<ul style="margin:10px 0 20px 20px;">'; foreach ( $options as $index => $item ) { printf( '<li>分类别名:%s | 折扣比例:%s%%</li>', esc_html( $item['cat_slug'] ), esc_html( $item['discount_percentage'] ) ); } echo '</ul>'; } // 输出新增配置的输入框 ?> <div style="display:flex;gap:10px;align-items:center;"> <input type='text' placeholder="输入分类别名" size="30" name='slug-configuration[new][cat_slug]' value=''> <input type='number' min="0" max="100" placeholder="折扣比例" size="10" name='slug-configuration[new][discount_percentage]' value=''> </div> <?php }
2 修改字段注册代码
替换原来的单字段注册,合并为同一个配置项渲染:
add_settings_field( 'cat_discount_group', // 字段ID '分类折扣配置', // 字段标题 'cat_discount_render', // 渲染回调 'slug-configuration', // 所属设置页面 'configuration' // 所属设置分区 );
3 新增数据保存逻辑
在register_setting的净化回调中处理追加逻辑:
// 注册设置时添加sanitize回调 register_setting( 'slug-configuration', // 配置组名 'slug-configuration', // 配置项名 'sanitize_cat_discount_config' // 数据净化回调 ); // 净化+追加数据的回调函数 function sanitize_cat_discount_config( $input ) { // 获取原有配置 $old_options = get_option( 'slug-configuration', [] ); // 检查是否有新提交的配置 if ( isset( $input['new'] ) && ! empty( $input['new']['cat_slug'] ) && is_numeric( $input['new']['discount_percentage'] ) ) { // 新配置去重(可选,根据需求开启) $exists = false; foreach ( $old_options as $item ) { if ( $item['cat_slug'] === $input['new']['cat_slug'] ) { $exists = true; add_settings_error( 'slug-configuration', 'duplicate-slug', '该分类别名已存在配置' ); break; } } if ( ! $exists ) { // 新配置格式校验后追加到数组 $new_item = [ 'cat_slug' => sanitize_text_field( $input['new']['cat_slug'] ), 'discount_percentage' => intval( $input['new']['discount_percentage'] ) ]; $old_options[] = $new_item; } } // 返回最终要保存的配置 return $old_options; }
调用方式示例
后续你需要读取所有配置使用时,直接调用即可:
$all_discount_config = get_option( 'slug-configuration', [] ); foreach ( $all_discount_config as $config ) { $cat_slug = $config['cat_slug']; $discount = $config['discount_percentage']; // 你的业务逻辑 }
内容的提问来源于stack exchange,提问作者Zaffar Saffee
相关产品推荐
相关产品推荐

