WordPress REST API中POST请求未触发update_callback问题排查
问题分析与修复方案
我看了你的代码,POST请求没触发update_user_acf_fields主要有几个关键原因,咱们一步步来解决:
1. 更新请求必须包含目标字段
WordPress的update_callback只有在你明确提交了grad字段的时候才会触发。也就是说,你POST到/wp-json/wp/v2/users/{user_id}时,请求体里必须包含"grad": "你的新值",比如:
{ "grad": "2024届" }
如果请求里没带这个字段,REST API只会处理其他默认字段,不会调用你的自定义更新回调。
2. update_callback的权限检查与返回值要求
你的update_user_acf_fields目前只是打日志,没有做权限验证,也没有返回正确的结果,这会导致WordPress无法正确识别回调的执行状态。你需要:
- 检查当前用户是否有权限更新目标用户
- 实际调用ACF的更新函数
- 返回更新后的值或者
WP_Error(如果失败)
3. 硬编码用户ID的问题(虽不影响回调触发,但属于bug)
get_user_acf_fields里你写死了user_32,这会导致所有用户请求都返回用户32的grad值,应该换成当前请求的用户ID:'user_' . $object['id']。
修复后的完整代码
add_action( 'rest_api_init', 'rest_api_user_meta_fields' ); function rest_api_user_meta_fields() { register_rest_field( 'user', 'grad', array( 'get_callback' => 'get_user_acf_fields', 'update_callback' => 'update_user_acf_fields', 'schema' => null, ) ); } function get_user_acf_fields( $object ) { // 使用当前请求的用户ID,而非硬编码32 $grad = get_field('grad', 'user_' . $object['id']); error_log('GET: 当前用户ID ' . $object['id'] . ' 的grad值: ' . $grad); return $grad; } function update_user_acf_fields( $value, $object, $field_name ) { // 检查当前用户是否有权限更新目标用户 if ( ! current_user_can( 'edit_user', $object->ID ) ) { return new WP_Error( 'rest_forbidden', __( '你没有权限更新该用户的字段。' ), array( 'status' => rest_authorization_required_code() ) ); } // 实际更新ACF字段 $updated = update_field( $field_name, $value, 'user_' . $object->ID ); if ( $updated ) { error_log('POST: 用户ID ' . $object->ID . ' 的grad字段已更新为: ' . $value); return $value; // 返回更新后的值,REST API会把这个值返回给客户端 } else { return new WP_Error( 'rest_update_failed', __( '字段更新失败。' ), array( 'status' => 500 ) ); } }
测试注意事项
- 确保你使用的用户账号拥有
edit_users权限(或至少能编辑目标用户) - POST请求的
Content-Type要设置为application/json - 请求体里必须包含
grad字段,否则不会触发更新回调
内容的提问来源于stack exchange,提问作者errorous
相关产品推荐
相关产品推荐

