WP REST API format response

时间:2016-04-01 作者:Aadi

我正在使用“WP REST API版本2.0-beta12”http://wp-api.org/ 使用REST API,可以通过HTTP以简单的JSON格式访问我的站点数据。我已格式化json输出以限制响应字段,同时列出post API-http://example.com/wp-json/wp/v2/posts 使用rest\\u prepare\\u post,如下所示,

function api_remove_extra_data( $data, $post, $context ) {
    // We only want to modify the \'view\' context, for reading posts
    if ( $context !== \'view\' || is_wp_error( $data ) ) {
        // Here, we unset any data we don\'t want to see on the front end:
        unset ( $data->data [\'link\']); 
        unset ( $data->data [\'date_gmt\']);
        unset ( $data->data [\'modified\']);
        unset ( $data->data [\'modified_gmt\']);
        unset ( $data->data [\'type\']);
        unset ( $data->data [\'content\']);
        unset ( $data->data [\'excerpt\']);
        unset ( $data->data [\'author\']);
        // continue unsetting whatever other fields you want
        return $data;
    }

}

add_filter( \'rest_prepare_post\', \'api_remove_extra_data\', 12, 3 );
它工作得很好。但我需要在单个post API调用中使用完整的post数据,例如

http://example.com/wp-json/wp/v2/posts/1077

Wordpress version:  4.4.2

Plugin Version : WP REST API 2.0-beta12
通过使用上述过滤器,两个帖子都列出API并查看单个帖子API只返回有限的响应。如何在post single中获取所有post数据(http://example.com/wp-json/wp/v2/posts/1077) 通过在帖子列表API中保持有限的响应?

1 个回复
SO网友:birgire

因为您正在使用rest_prepare_{post_type} 过滤器,您可以将其限制为WP_REST_Posts_Controller::get_items() 回调,使用rest_{post_type}_query 过滤器:

add_filter( \'rest_post_query\', function( $args )
{
    add_filter( \'rest_prepare_post\', \'api_remove_extra_data\', 12, 3 );
    return $args;
} );
其中岗位类型为post.

请注意,通常我们总是希望返回过滤器值,我不遵循您的逻辑api_remove_extra_data() 回调。也许这是版本1的遗物。十、

这就是现在在版本2中定义过滤器的方式:

/**
 * Filter the post data for a response.
 *
 * The dynamic portion of the hook name, $this->post_type, refers to post_type of the post
 * being prepared for the response.
 *
 * @param WP_REST_Response   $response   The response object.
 * @param WP_Post            $post       Post object.
 * @param WP_REST_Request    $request    Request object.
*/
return apply_filters( "rest_prepare_{$this->post_type}", $response, $post, $request );