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

插件更新后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:07:43