You can modify the response data via the rest_prepare_{$this->post_type}
filter, like so for a custom post type test_cpt
(registered with hierarchical
and show_in_rest
set to true
):
add_filter( 'rest_prepare_test_cpt', 'rest_prepare_test_cpt' );
function rest_prepare_test_cpt( WP_REST_Response $response ) {
$data = $response->get_data();
if ( ! empty( $data['parent'] ) ) {
if ( ! $parent_post = get_post( $data['parent'] ) ) {
return $response;
}
// Include only some post data.
$data['parent_data'] = [
'title' => get_the_title( $parent_post ), // or just $parent_post->post_title
'excerpt' => get_the_excerpt( $parent_post ), // or just $parent_post->post_excerpt
'link' => get_permalink( $parent_post ),
];
// Or include the whole data..
// $data['parent_data'] = $parent_post; // object
// $data['parent_data'] = $parent_post->to_array(); // array
$response->set_data( $data );
}
return $response;
}
WP_REST_Response
extends WP_HTTP_Response
which defines the get_data()
and set_data()
methods.
Note that the code may not work if you set a different rest_controller_class
when you register the post type. (The default controller class is WP_REST_Posts_Controller
which fires the filter used above)