通过 WordPress rest api 更新 Advanced Custom Fields 字段时为什么会失败 ( 接口返回 acf: false )?
这个问题困扰了我好几天,网上找了很多答案都行不通,问了一些 ai 也没解决。
最后还是查到了解决方案。
问题表现
不管是使用 js 代码还是通过 postman 这种工具,通过 WordPress rest api 创建或更新文章时,提交的 acf 相关字段明明有值,但是在后台全部都是空,即使我已经开始了 Advanced Custom Fields 相关字段的 Show in REST API 设置。
问题原因
既不是代码写得有问题,也不是权限问题,更不是网上说的不应该直接用字段名而应该用(Field Key)标签(后面跟着一串以 field_ 开头的字符串(例如:field_6578abc123def))这种说法。
真实的原因就是通过 WordPress rest api 不能直接修改 Advanced Custom Fields 的字段,只能读取。
所以要把这个限制解开。方法如下:
解决方案
// 1. 让 ACF 字段出现在 REST API 响应中(读取)
function add_acf_to_rest_response($data, $post, $context) {
// 方式A:添加所有 ACF 字段
$data->data['acf'] = get_fields($post->ID);
// 方式B:只添加指定字段(推荐,减少数据量)
// $data->data['acf'] = [
// 'article_subtitle' => get_field('article_subtitle', $post->ID),
// 'article_views' => get_field('article_views', $post->ID)
// ];
return $data;
}
add_filter('rest_prepare_post', 'add_acf_to_rest_response', 10, 3);
// 2. 允许通过 REST API 更新 ACF 字段(写入)
function update_acf_via_rest($post, $request) {
// 验证权限:只有能编辑文章的用户才能更新
if (!current_user_can('edit_post', $post->ID)) {
return $post;
}
// 获取请求中的 ACF 数据(核心:从 request 中提取 acf 节点)
$acf_data = $request->get_param('acf');
// 仅当 acf 数据存在且为数组时更新
if (!empty($acf_data) && is_array($acf_data)) {
foreach ($acf_data as $field_name => $field_value) {
// 使用 ACF 官方函数更新字段(自动验证字段类型)
update_field($field_name, $field_value, $post->ID);
}
}
return $post;
}
// 绑定到「更新文章」和「创建文章」的钩子
add_action('rest_after_update_post', 'update_acf_via_rest', 10, 2);
add_action('rest_after_insert_post', 'update_acf_via_rest', 10, 2);通过以上设置,再次更新,WordPress 后台的 Advanced Custom Fields 相关字段 100% 有值了。