
本文详解在 wordpress 中使用 acf 插件时,如何通过 `update_field()` 正确更新深度嵌套在 group 字段内的子字段(如“周一上午营业时间”),避免 `update_sub_field()` 失效或数据写入失败的问题。
在 ACF(Advanced Custom Fields)中,当字段结构为「Group → Group → Sub Field」(即多层嵌套 Group,非 Repeater)时,update_sub_field() 并不适用——它仅支持在当前已存在的 Repeater 或 Flexible Content 行内更新子字段,且必须配合 have_rows() / the_row() 在循环上下文中调用。而你的字段结构是静态嵌套的 Group(非可重复),因此 have_rows() 始终返回 false,导致整个逻辑被跳过,数据根本不会写入。
✅ 正确做法是:将整个嵌套结构视为一个关联数组,用 update_field() 一次性写入顶层 Group 字段。
以你的实际结构为例:
- 顶层 Group 字段键:field_61f453c010074("Working hours")
- 其下包含多个子 Group 字段,如 field_61f4570e89281("Monday")
- "Monday" Group 内含两个 Number 子字段:field_61f4573589282(AM)、field_61f4574589283(PM)
由于所有 Group 字段均为单例(non-repeating),其值应以扁平化关联数组形式组织,无需模拟 Repeater 的多维数组结构。错误示例中你尝试用 array( array( ... ) ) 包裹 Monday 数据,这其实是 Repeater 的写法,会导致 ACF 无法识别并静默丢弃。
? 正确代码如下(适用于创建或更新 CPT 时):
// 构建完整的嵌套 Group 数据结构(注意:每层都是关联数组,不是二维数组)
$working_hours_data = array(
'field_61f4570e89281' => array( // Monday Group
'field_61f4573589282' => (int) $_POST['monday_am'] ?? 0, // AM
'field_61f4574589283' => (int) $_POST['monday_pm'] ?? 0, // PM
),
'field_61f7a30ffbcf0' => array( // Tuesday Group
'field_61f7a30ffbcf1' => (int) $_POST['tuesday_am'] ?? 0,
'field_61f7a30ffbcf2' => (int) $_POST['tuesday_pm'] ?? 0,
),
// …… 依此类推:Wednesday 至 Sunday
);
// 一次性更新顶层 Group 字段
update_field('field_61f453c010074', $working_hours_data, $post_id);? 关键要点:
- ✅ Group 字段值 = 关联数组:每个子 Group 字段键(如 'field_61f4570e89281')作为键名,其值为该 Group 内部子字段组成的关联数组。
- ❌ 不要套用 Repeater 语法:array( array( ... ) ) 是给 Repeater 字段准备的;Group 字段只需一层 array( 'sub_group_key' => array( 'sub_field_key' => $value ) )。
- ✅ 类型安全:对 Number 字段显式 (int) 转换,避免字符串写入导致前端显示异常。
- ✅ 键名必须准确:务必使用 ACF 字段编辑页中显示的 Field Key(形如 field_XXXXXXX),而非字段名称(如 'monday')。
- ✅ $post_id 必须有效:确保在 wp_insert_post() 后获取到真实 $post_id,并在保存 ACF 前验证其存在。
? 额外建议:若未来需支持「每周多组营业时段」(如节假日特殊排班),应将最外层改为 Repeater 字段,此时才需使用 array( array( ... ), array( ... ) ) 结构,并配合 update_sub_field() 在循环中操作。但就当前静态周七天结构而言,纯 Group + update_field() 是最简洁、可靠的方式。
总结:嵌套 Group 字段不是 Repeater,别用 Repeater 的思维处理;用 update_field() 直接提交结构化数组,既高效又稳定。










