WP_REST_Server::embed_links()protectedWP 4.4.0

Embeds the links from the data into the request.

Method of the class: WP_REST_Server{}

Hooks from the method

Return

Array. Data with sub-requests embedded.

Usage

// protected - for code of main (parent) or child class
$result = $this->embed_links( $data, $embed );
$data(array) (required)
Data from the request.
$embed(true|false|string[])
Whether to embed all links or a filtered list of link relations.
Default: true

Changelog

Since 4.4.0 Introduced.
Since 5.4.0 The $embed parameter can now contain a list of link relations to include.

WP_REST_Server::embed_links() code WP 6.5.2

protected function embed_links( $data, $embed = true ) {
	if ( empty( $data['_links'] ) ) {
		return $data;
	}

	$embedded = array();

	foreach ( $data['_links'] as $rel => $links ) {
		/*
		 * If a list of relations was specified, and the link relation
		 * is not in the list of allowed relations, don't process the link.
		 */
		if ( is_array( $embed ) && ! in_array( $rel, $embed, true ) ) {
			continue;
		}

		$embeds = array();

		foreach ( $links as $item ) {
			// Determine if the link is embeddable.
			if ( empty( $item['embeddable'] ) ) {
				// Ensure we keep the same order.
				$embeds[] = array();
				continue;
			}

			if ( ! array_key_exists( $item['href'], $this->embed_cache ) ) {
				// Run through our internal routing and serve.
				$request = WP_REST_Request::from_url( $item['href'] );
				if ( ! $request ) {
					$embeds[] = array();
					continue;
				}

				// Embedded resources get passed context=embed.
				if ( empty( $request['context'] ) ) {
					$request['context'] = 'embed';
				}

				if ( empty( $request['per_page'] ) ) {
					$matched = $this->match_request_to_handler( $request );
					if ( ! is_wp_error( $matched ) && isset( $matched[1]['args']['per_page']['maximum'] ) ) {
						$request['per_page'] = (int) $matched[1]['args']['per_page']['maximum'];
					}
				}

				$response = $this->dispatch( $request );

				/** This filter is documented in wp-includes/rest-api/class-wp-rest-server.php */
				$response = apply_filters( 'rest_post_dispatch', rest_ensure_response( $response ), $this, $request );

				$this->embed_cache[ $item['href'] ] = $this->response_to_data( $response, false );
			}

			$embeds[] = $this->embed_cache[ $item['href'] ];
		}

		// Determine if any real links were found.
		$has_links = count( array_filter( $embeds ) );

		if ( $has_links ) {
			$embedded[ $rel ] = $embeds;
		}
	}

	if ( ! empty( $embedded ) ) {
		$data['_embedded'] = $embedded;
	}

	return $data;
}