简体   繁体   中英

Getting Wordpress REST-API content data inside a plugin with embed data

I'm creating my own routes for the wodpress api. At some point I need the rest content of the post and pages, to do this i have this function:

function get_rest_content($id, $type)
{
    if ($id > 0) {
        $request = new WP_REST_Request('GET', '/wp/v2/'.$type.'/' . $id);
        $response = rest_do_request($request)->data;
    } else {
        $response = null;
    }


    if (empty($response)) {
        return new WP_Error('wpse-error',
            esc_html__('No '.$type. 'found', 'wpse'),
            ['status' => 404]);
    }
    return $response;
}

$post_1 = get_rest_content(1,'posts') // give me the rest content of the post with id=1

but if I want to have the post content with embed data I change:

new WP_REST_Request('GET', '/wp/v2/'.$type.'/' . $id);

to

new WP_REST_Request('GET', '/wp/v2/'.$type.'/' . $id . '?_embed=true');

but this new request returns rest_no_route error

I have read the source code and now understand. The second parameter of new WP_REST_Request() is the route only without query parameters. The query parameters are specified in another method. Eg,

$request = new WP_REST_Request( 'GET', 'wp/v2/posts/999' );
$request->set_query_params( [ '_embed' => '1' ] );

However, this will not work as '_embed' is a special query parameter. It is not handled by WP_REST_Server::dispatch(), which means rest_do_request() will not handle '_embed' as rest_do_request() is just a wrapper of WP_REST_Server::dispatch().

The reason '_embed' works from a URL is that URLs are processed by WP_REST_Server::serve_request() which calls WP_REST_Server::dispatch() but also calls WP_REST_Server::response_to_data() which calls WP_REST_Server::embed_links().

If you want '_embed' to work in your get_rest_content() you will need to add the code for WP_REST_Server::embed_links().

I found a Github issue but the workaround is not working for me (at least for my code+WordPress version): https://github.com/WP-API/WP-API/issues/2857

Did you try adding the embeddable links to the response?

//get the post
$response = rest_do_request($request)->get_data();

//add the embeddable links 
$results_with_embed = rest_ensure_response(rest_get_server()->response_to_data( $response, true ));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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