插件更新后ACF内置REST API重复器字段键随机问题求助
解决ACF内置REST端点重复器字段随机键问题
1. 是否有其他用户遇到类似问题?
是的,不少开发者在ACF版本升级(尤其是切换到6.x系列)、替换ACF-to-REST插件为ACF内置端点后,都遇到过重复器字段返回数字随机键的问题。这是因为ACF内置端点默认将重复器字段的子字段以数字索引数组返回,而ACF-to-REST插件则保留子字段名称作为键,两者返回结构的差异导致前端无法正常解析数据。
2. 保持字段键稳定的方案
方案一:用ACF REST过滤器重写返回结构
通过acf/rest_api/response/{type}/prepare_item过滤器,可手动将重复器字段的数字索引转换为子字段名称作为键,示例代码(添加到主题functions.php或自定义插件中):
// 针对文章类型修正ACF REST返回的重复器字段键 add_filter('acf/rest_api/response/post/prepare_item', 'stabilize_acf_repeater_keys', 10, 3); function stabilize_acf_repeater_keys($response, $post, $request) { // 替换为你的重复器字段键,可批量处理多个字段 $target_repeaters = ['your_repeater_field', 'another_repeater']; foreach ($target_repeaters as $repeater_key) { if (isset($response['acf'][$repeater_key])) { $fixed_items = []; foreach ($response['acf'][$repeater_key] as $item) { $fixed_item = []; foreach ($item as $sub_key => $value) { $sub_field = get_field_object($sub_key); // 用子字段名称替代原始键 $fixed_item[$sub_field ? $sub_field['name'] : $sub_key] = $value; } $fixed_items[] = $fixed_item; } $response['acf'][$repeater_key] = $fixed_items; } } return $response; }
方案二:通过字段格式化过滤器修正
使用acf/format_value过滤器,针对重复器字段单独处理返回格式:
add_filter('acf/format_value/type=repeater', 'fix_repeater_format', 10, 3); function fix_repeater_format($value, $post_id, $field) { if (is_rest()) { $fixed_value = []; foreach ($value as $item) { $fixed_item = []; foreach ($field['sub_fields'] as $sub_field) { $fixed_item[$sub_field['name']] = $item[$sub_field['key']]; } $fixed_value[] = $fixed_item; } return $fixed_value; } return $value; }
3. 替代方案建议
- 自定义REST端点:如果项目对数据格式稳定性要求高,建议自行注册自定义REST端点,直接用
get_field()获取ACF数据并按需构造返回结构,完全避免ACF内置端点的格式问题,示例代码:
add_action('rest_api_init', function() { register_rest_route('custom/v1', '/posts/(?P<id>\d+)', [ 'methods' => 'GET', 'callback' => 'get_custom_post_acf_data', ]); }); function get_custom_post_acf_data($request) { $post_id = $request['id']; $data = [ 'post_title' => get_the_title($post_id), 'acf_data' => [ 'repeater_field' => get_field('your_repeater_field', $post_id), // 其他需要返回的ACF字段 ] ]; return rest_ensure_response($data); }
- 第三方插件替代:可以尝试使用
WP REST API Custom Fields这类轻量插件,它支持自定义配置ACF字段的REST返回格式,能稳定保留重复器字段的键结构。 - 临时回退(不推荐长期使用):如果当前ACF和WordPress版本兼容ACF-to-REST插件的旧版本,可临时回退使用,但需注意插件的维护状态,避免安全风险。
内容的提问来源于stack exchange,提问作者Marko Marinkovic
相关产品推荐
相关产品推荐

