remove _links object from wp rest api response by filter or hook

Viewed 3802

I have removed unwanted data by unset($data->data['field_name']) from json output. For this I am using wordpress filter rest_prepare_.

But how we remove _links object from JSON output?

5 Answers

I don’t know how to unset, but you can set which variables to return.

function prepare_rest($data, $post, $request){
    return [
        'id'    => $data->data['id'],
        'title' => $data->data['title']['rendered']
    ];
}

add_filter('rest_prepare_post', 'prepare_rest', 10, 3);

Gotta be careful removing stuff from the API, but if you're sure you want to remove this, it can be done like this:

function so_45027789_rest_prepare_post($data, $post, $request)
{
    foreach($data->get_links() as $_linkKey => $_linkVal) {
        $data->remove_link($_linkKey);
    }
    return $data;
}

add_filter('rest_prepare_post', 'so_45027789_rest_prepare_post', 1, 3);

I'd recommend only doing so if you're explicitly asking for a smaller response in your implementation with the API, thereby leaving default usage of the API untouched, like via a query variable:

function so_45027789_rest_prepare_post($data, $post, $request)
{
    $params = $request->get_params();
    if(isset($params['_minimal'])) {
        foreach($data->get_links() as $_linkKey => $_linkVal) {
            $data->remove_link($_linkKey);
        }
    }
    return $data;
}

add_filter('rest_prepare_post', 'so_45027789_rest_prepare_post', 1, 3);

Unfortunately, you cannot remove it, it’s protected.

    unset( $data->links );

    PHP Fatal error:  Uncaught Error: Cannot access protected property WP_REST_Response::$links 

    /wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php(311)
        Line 1567:  $response->add_links( $this->prepare_links( $post ) );
        Line 1608:  protected function prepare_links( $post ) {
Related