sandeep jain
sandeep jain

Reputation: 71

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

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?

Upvotes: 6

Views: 5710

Answers (5)

Josh Davenport-Smith
Josh Davenport-Smith

Reputation: 5511

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);

Upvotes: 5

Manian Rezaee
Manian Rezaee

Reputation: 1012

This is not very good solution but work.

function contract_remove_links( $data, $post, $context ) {

    $data->remove_link( 'collection' );
    $data->remove_link( 'self' );
    $data->remove_link( 'about' );
    $data->remove_link( 'author' );
    $data->remove_link( 'replies' );
    $data->remove_link( 'version-history' );
    $data->remove_link( 'https://api.w.org/featuredmedia' );
    $data->remove_link( 'https://api.w.org/attachment' );
    $data->remove_link( 'https://api.w.org/term' );
    $data->remove_link( 'curies' );

    return $data;
}

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

Upvotes: 4

Ajay Ghaghretiya
Ajay Ghaghretiya

Reputation: 822

The rest_prepare_post is the right filter to use, but the _links field is dynamically generated by WordPress. So you can’t remove things to it directly.

you can add your own link in this parameter or you can remove the default link from the "_links".

Here is the code....

add_filter( 'rest_prepare_post', function ( $response ) {
$response->add_link( 'yourrel', rest_url( 'yourendpoint/thing' ), array(
    'embeddable' => true,
) );

$response->remove_link( 'collection' );

return $response;
} );

Upvotes: 0

shanebp
shanebp

Reputation: 1946

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 ) {

Upvotes: -1

Huseyn
Huseyn

Reputation: 49

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);

Upvotes: 5

Related Questions