WordPress自定义REST API如何返回无引号的响应?
问题
现有自定义WP REST API端点代码如下:
add_action('rest_api_init', function () { $namespace = 'wp/v2'; $routes = ['products', 'product-categories']; foreach($routes as $route) { register_rest_route($namespace, $route, [ 'methods' => WP_REST_Server::READABLE, 'callback' => 'custom_rest' ]); } }); function custom_rest() { return new WP_REST_Response('[{}]', 200); }
当前客户端收到的响应是带引号的'[{}]'或"[{}]",但我希望像默认的/posts接口那样,直接返回不带引号的[{}]。请问该如何修改custom_rest()函数?
解决方案
你现在的问题根源在于:把已经编码好的JSON字符串直接传给WP_REST_Response后,WordPress会把这个字符串当作普通文本再次执行JSON编码,所以才会多出一层引号。这里有两种靠谱的解决方式:
方式一:返回PHP数组/对象(推荐)
这是WordPress REST API的标准用法,默认接口(比如/posts)都是这么做的——WP会自动把PHP的数组或对象序列化为正确的JSON格式,不需要手动编码。修改后的函数如下:
function custom_rest() { // 用PHP数组包裹空对象,对应JSON的 [{}] return new WP_REST_Response([(object)[]], 200); }
这样客户端收到的就是不带多余引号的[{}],和默认接口的返回格式完全一致。
方式二:手动输出原始JSON字符串
如果你的场景中已经有预先生成好的JSON字符串,不想再转成PHP结构,可以通过设置响应头和内容类型,避免WP再次编码:
function custom_rest() { $response = new WP_REST_Response(); // 指定响应内容类型为JSON $response->set_content_type('application/json'); // 设置原始JSON内容,WP不会再对其编码 $response->set_data('[{}]'); return $response; }
内容的提问来源于stack exchange,提问作者stckvrw
相关产品推荐
相关产品推荐

