使用WordPress REST API更新含空格用户元数据的问题
解决WordPress REST API更新含空格用户元数据时被识别为数组的问题
我之前碰到过一模一样的问题,这大概率是元数据注册的配置不够严格,或者请求数据的格式有偏差导致的。下面是具体的排查和解决步骤:
1. 先把用户元数据的注册配置做对
首先检查register_meta的参数,核心是要明确告诉WordPress:这个元字段是单值字符串,不是数组。
register_meta( 'user', 'community_name', array( 'type' => 'string', 'description' => '用户所属社区名称(允许包含空格)', 'single' => true, // 关键:设为true,标记这是单值元数据,不是多值数组 'show_in_rest' => array( 'schema' => array( 'type' => 'string', // 明确告诉REST API该字段是字符串类型 'maxLength' => 255, // 可选,加个长度限制增强验证 ), ), 'sanitize_callback' => 'sanitize_text_field', // 确保值被清理为纯字符串 'auth_callback' => function() { // 验证当前用户是否有权限编辑目标用户的元数据 return current_user_can( 'edit_user', get_current_user_id() ); }, ) );
这里的single => true和show_in_rest.schema.type => 'string'是关键,它们会让REST API严格校验字段类型,拒绝数组格式的输入。
2. 调整wp_remote_post的请求格式
默认情况下,wp_remote_post会把body数组转换成application/x-www-form-urlencoded格式,虽然多数情况没问题,但对于带空格的字符串,偶尔会因为解析逻辑被误判成数组。推荐改用JSON格式发送请求,彻底避免解析歧义:
$target_user_id = 123; // 要更新的目标用户ID $new_meta_value = 'community test'; // 带空格的元数据值 // 构建请求参数 $request_args = array( 'headers' => array( 'Content-Type' => 'application/json', // 指定请求为JSON格式 'Authorization' => 'Bearer ' . get_rest_auth_token(), // 替换为你的REST授权令牌 ), 'body' => json_encode( array( 'meta' => array( 'community_name' => $new_meta_value, ), ) ), 'method' => 'POST', 'timeout' => 15, ); // 发送请求 $response = wp_remote_post( rest_url( "wp/v2/users/{$target_user_id}" ), $request_args ); // 处理响应 if ( is_wp_error( $response ) ) { error_log( 'REST API请求失败:' . $response->get_error_message() ); } else { $response_data = json_decode( wp_remote_retrieve_body( $response ), true ); // 验证更新结果 if ( isset( $response_data['meta']['community_name'] ) && $response_data['meta']['community_name'] === $new_meta_value ) { echo '元数据更新成功!'; } } // 辅助函数:获取REST授权令牌(根据你的实际登录逻辑调整) function get_rest_auth_token() { $user = wp_get_current_user(); return get_user_meta( $user->ID, 'rest_auth_token', true ); }
用JSON格式发送能确保带空格的字符串被完整传递,不会被拆分或误解析。
3. 额外的排查小细节
- 如果之前已经错误生成了数组类型的元数据,先手动清理:用
delete_user_meta( $user_id, 'community_name' )删除旧的错误数据,再重新更新。 - 检查是否有其他插件/主题通过
rest_pre_insert_user钩子修改了元数据的处理逻辑,导致值被强制转成数组。
按上面的步骤操作后,带空格的用户元数据就能被正确识别为字符串并更新,不会再被当成数组新增字段了。
内容的提问来源于stack exchange,提问作者Never Stop Learning
相关产品推荐
相关产品推荐

