在WordPress的register_rest_route回调中echo响应数据是否可行?
WordPress REST API 回调实现规范与格式化JSON解决方案
你的echo输出响应的方式不符合WordPress REST API规范,不建议使用,会破坏API的响应结构、头部处理逻辑,甚至可能引发内容冲突。下面详细说明问题原因和正确实现方式:
核心误解澄清
你提到的"回调应返回布尔值"是对文档的误读:
permission_callback(权限回调)需要返回布尔值,用于验证请求权限- 路由的业务
callback(如你的get_info)可以返回以下类型:WP_REST_Response对象(推荐)- 数组/原生数据(会被自动包装为
WP_REST_Response) WP_Error对象(自动转换为标准错误响应)
原实现问题分析
你用return json_encode(...)得到带转义的JSON,是因为WordPress会自动对回调返回的字符串进行二次JSON序列化,导致最终响应是"字符串包裹的JSON"。而直接echo会绕过WP的响应处理机制,丢失正确的Content-Type头部、错误状态码处理等核心功能。
正确实现:返回格式化JSON的规范写法
修正后的路由注册(移除多余闭合括号)
register_rest_route( 'example/v1', '/test/(?P<id>[\d]+)', array( 'methods' => WP_REST_Server::READABLE, 'callback' => 'get_info', 'permission_callback' => '__return_true' ) );
规范的回调函数
function get_info( $request ) { // 示例:假设$response是远程API请求结果 $response = wp_remote_get('https://example.com/api/data'); // 处理请求错误 if ( is_wp_error( $response ) ) { return new WP_Error( 'remote_api_failure', $response->get_error_message(), array( 'status' => 500 ) ); } // 解析远程响应体 $body_content = wp_remote_retrieve_body( $response ); $body_data = json_decode( $body_content, true ); // 处理JSON解析错误 if ( json_last_error() !== JSON_ERROR_NONE ) { return new WP_Error( 'invalid_json', 'Failed to parse remote API response', array( 'status' => 500 ) ); } // 创建REST响应对象并启用格式化 $rest_response = rest_ensure_response( $body_data ); // 设置正确响应头 $rest_response->set_headers( array( 'Content-Type' => 'application/json; charset=utf-8', ) ); // 强制启用JSON格式化 $rest_response->set_json_options( JSON_PRETTY_PRINT ); return $rest_response; }
额外说明
- 调试模式下(
WP_DEBUG = true),WordPress默认会输出格式化的JSON;生产环境可通过set_json_options强制开启。 - 始终通过WP的响应机制返回数据,确保API符合REST规范,兼容各类客户端工具。
内容的提问来源于stack exchange,提问作者Gregory Bologna
相关产品推荐
相关产品推荐

