[英]Is it possible to modify a WordPress REST API built-in response field?
在我的 WordPress 安装中,我想为我们的帖子标题添加一个前缀,通过 REST API 访问。
特别是,我调用/wp-json/wp/v2/posts
端点,它返回:
//....
"title": {
"rendered": "A Title"
},
//....
我的意图是在所有帖子标题中每次调用 REST API 时添加一个前缀。 就像是:
//....
"title": {
"rendered": "[TEST] A Title"
},
//....
我的感觉是我应该添加一个关于 REST 端点调用的过滤器。 我也考虑过这一点,但是我不想添加新字段或元数据,只需修改现有字段或元数据。 这有可能吗?
我假设您不想创建自己的“自定义”端点:
我会保留您收到的请求,因为这是 JSON 格式。 然后可以使用 json_decode 来制作响应数组。
您可以在输出之前遍历数组并编辑您想要编辑的内容。
这样就够了吗?
有一种方法,但它有点hacky。
控制器/路由处理程序有点僵硬, WP_REST_Posts_Controller
使用get_posts()
和WP_Query
,所以我不知道有什么明智的方法。
但是您可以使用WP_REST_Server::respond_to_request
中使用的rest_request_after_callbacks
过滤器。
你可以这样做:
add_filter(
'rest_request_after_callbacks',
function( $response, array $handler, \WP_REST_Request $request ) {
if ( is_get_posts_request( $request ) ) {
mutate_get_posts_response( $response );
}
return $response;
},
10,
3
);
function is_get_posts_request( \WP_REST_Request $request ) {
return '/wp/v2/posts' === $request->get_route()
&& 'GET' === $request->get_method();
}
function mutate_get_posts_response( $response ) {
if ( ! ( $response instanceof \WP_REST_Response ) ) {
return;
}
$data = array_map(
'prefix_post_response',
$response->get_data()
);
$response->set_data( $data );
}
function prefix_post_response( array $post ) {
if ( isset( $post['title']['rendered'] ) ) {
$post['title']['rendered'] = '[TEST] ' . $post['title']['rendered'];
}
return $post;
}
对于每条路线,您都必须转换响应。 幸运的是,响应遵循相同的模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.