Manipulação _embed para pontos de extremidade de API REST personalizados

Estou preparando um plugin para a integração da API REST (a versão do núcleo WP 4.7) fornecendo pontos finais personalizados para os dados do plugin. Uma das coisas que estou tentando fazer é definir uma propriedade _links na resposta e tornar o recurso vinculado incorporável. Trecho de código bastante simplificado:

 class Clgs_REST_Logs extends WP_REST_Controller { const NSPACE = 'clgs'; const BASE = 'logs'; public function register_routes() { register_rest_route( self::NSPACE, '/' . self::BASE, array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_items' ), ), 'schema' => array( $this, 'get_public_item_schema' ), ) ); register_rest_route( self::NSPACE, '/' . self::BASE . '/count', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_count' ), ), 'schema' => array( $this, 'get_count_schema' ), ) ); } public function get_items( $request ) { $log_entries = // get an array $collection = $this->prepare_collection_for_response( $log_entries, $request ); $response = rest_ensure_response( array( 'items' => $collection ) ); $max_pages = max( 1, ceil( $total_items / (int) $params['per_page'] ) ); $this->set_count_headers( $response, (int) $total_items, (int) $max_pages ); $count_link = $this->prepare_link_url( array( self::BASE, 'count' ) ); $response->add_links( array ( 'count' => array( 'href' => $count_link, 'embeddable' => true ), ) ); return $response; } public function get_count( $request ) { // provide some statistics data } public function prepare_link_url ( $parts = array() ) { array_unshift( $parts, self::NSPACE ); return rest_url( implode( '/', $parts ) . '/' ); } } 

Uma resposta a uma solicitação http://wptesting.intern/index.php/wp-json/clgs/logs/?_embed parece com isto:

 { "items": [...], "_links": { "count": [{ "embeddable": true, "href": "http://wptesting.intern/index.php/wp-json/clgs/logs/" }] }, "_embedded": { "count": [{ "code": "rest_no_route", "message": "No route was found matching the URL and request method", "data": {"status":404} }] } } 

Os pedidos para http://wptesting.intern/index.php/wp-json/clgs/logs/count/ , se feito separadamente, são bem-sucedidos.

Eu fiz isso adicionalmente com belos premalinks desativados e http://wptesting.intern/index.php/?route=... para ter certeza de que este não é um problema de reescrita de roteamento, e o mesmo acontece.

Alguém tem uma ideia de por que a incorporação falha?

Solutions Collecting From Web of "Manipulação _embed para pontos de extremidade de API REST personalizados"

O corte no final é o culpado. Enquanto os pedidos reais com um / no final da rota obtêm wp_unslash() ed antes de resolver, os links para incorporações não.

Assim,

  public function prepare_link_url ( $parts = array() ) { array_unshift( $parts, self::NSPACE ); return rest_url( implode( '/', $parts ) ); } 

faz o truque.