繁体   English   中英

是否可以修改 WordPress REST API 内置响应字段?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM