diff --git src/wp-includes/rest-api/class-wp-rest-server.php src/wp-includes/rest-api/class-wp-rest-server.php
index ec8d2a0..af0810e 100644
--- src/wp-includes/rest-api/class-wp-rest-server.php
+++ src/wp-includes/rest-api/class-wp-rest-server.php
@@ -379,7 +379,7 @@ class WP_REST_Server {
 			}
 
 			// Embed links inside the request.
-			$result = $this->response_to_data( $result, isset( $_GET['_embed'] ) );
+			$result = $this->response_to_data( $result, isset( $_GET['_embed'] ), $request );
 
 			$result = wp_json_encode( $result );
 
@@ -407,8 +407,9 @@ class WP_REST_Server {
 	 * @since 4.4.0
 	 * @access public
 	 *
-	 * @param WP_REST_Response $response Response object.
-	 * @param bool             $embed    Whether links should be embedded.
+	 * @param WP_REST_Response        $response Response object.
+	 * @param bool                    $embed    Whether links should be embedded.
+	 * @param bool | WP_REST_Request  $request  The request to respond to. Not always passed.
 	 * @return array {
 	 *     Data with sub-requests embedded.
 	 *
@@ -416,7 +417,7 @@ class WP_REST_Server {
 	 *     @type array [$_embedded] Embeddeds.
 	 * }
 	 */
-	public function response_to_data( $response, $embed ) {
+	public function response_to_data( $response, $embed, $request = false ) {
 		$data  = $response->get_data();
 		$links = $this->get_compact_response_links( $response );
 
@@ -429,7 +430,7 @@ class WP_REST_Server {
 			if ( wp_is_numeric_array( $data ) ) {
 				$data = array_map( array( $this, 'embed_links' ), $data );
 			} else {
-				$data = $this->embed_links( $data );
+				$data = $this->embed_links( $data, $request );
 			}
 		}
 
@@ -529,7 +530,8 @@ class WP_REST_Server {
 	 * @since 4.4.0
 	 * @access protected
 	 *
-	 * @param array $data Data from the request.
+	 * @param array                   $data     Data from the request.
+	 * @param bool | WP_REST_Request  $request  The request that contains passed parameters. Not always passed.
 	 * @return array {
 	 *     Data with sub-requests embedded.
 	 *
@@ -537,19 +539,31 @@ class WP_REST_Server {
 	 *     @type array [$_embedded] Embeddeds.
 	 * }
 	 */
-	protected function embed_links( $data ) {
+	protected function embed_links( $data, $request = false ) {
 		if ( empty( $data['_links'] ) ) {
 			return $data;
 		}
 
 		$embedded = array();
 
+		// Get link relationships to filter on, but only if not _embed=1 or _embed=true or empty _embed=
+		$params = false !== $request ? $request->get_query_params() : false;
+		$filtered_rels = false;
+		if ( false !== $params && isset( $params['_embed'] ) && '1' !== $params['_embed'] && 'true' !== $params['_embed'] ) {
+			$filtered_rels = array_filter( is_array( $params['_embed'] ) ? $params['_embed'] : explode( ',', $params['_embed'] ) );
+		}
+
 		foreach ( $data['_links'] as $rel => $links ) {
 			// Ignore links to self, for obvious reasons.
 			if ( 'self' === $rel ) {
 				continue;
 			}
 
+			// If filtered rels are specified and current $rel is not in the list, then continue.
+			if ( ! empty( $filtered_rels ) && ! in_array( $rel, $filtered_rels, true ) ) {
+				continue;
+			}
+
 			$embeds = array();
 
 			foreach ( $links as $item ) {
diff --git tests/phpunit/tests/rest-api/rest-posts-controller.php tests/phpunit/tests/rest-api/rest-posts-controller.php
index f48709e..2779e5d 100644
--- tests/phpunit/tests/rest-api/rest-posts-controller.php
+++ tests/phpunit/tests/rest-api/rest-posts-controller.php
@@ -942,6 +942,65 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		$this->assertEquals( rest_url( '/wp/v2/users/' . self::$author_id ), $links['author'][0]['href'] );
 	}
 
+	public function test_get_item__embed() {
+
+		// Prepare a new post. This will be first item when querying /wp/v2/posts
+		wp_set_current_user( self::$editor_id );
+		$post_id   = $this->factory->post->create();
+		$category1 = wp_insert_term( 'Embed Test Category', 'category' );
+		$category2 = wp_insert_term( 'Second Embed Test Category', 'category' );
+		wp_set_post_categories( $post_id, array( $category1['term_id'], $category2['term_id'] ) );
+		$this->factory->comment->create_post_comments( $post_id, 1 );
+
+		// ?_embed=1 should return all expected embeds. In this case 'author', 'replies' and 'wp:term'.
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/posts' );
+		$request->set_param( '_embed', '1' );
+		$response = $this->server->dispatch( $request );
+		$data     = $response->get_data();
+		$data     = array_shift( $data );
+		$embeds   = $this->server->embed_links( $data, $request );
+
+		$this->assertArrayHasKey( 'author', $embeds['_embedded'] );
+		$this->assertArrayHasKey( 'replies', $embeds['_embedded'] );
+		$this->assertArrayHasKey( 'wp:term', $embeds['_embedded'] );
+
+		// ?_embed=true should return all expected embeds. In this case 'author', 'replies' and 'wp:term'.
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/posts' );
+		$request->set_param( '_embed', 'true' );
+		$response = $this->server->dispatch( $request );
+		$data     = $response->get_data();
+		$data     = array_shift( $data );
+		$embeds   = $this->server->embed_links( $data, $request );
+
+		$this->assertArrayHasKey( 'author', $embeds['_embedded'] );
+		$this->assertArrayHasKey( 'replies', $embeds['_embedded'] );
+		$this->assertArrayHasKey( 'wp:term', $embeds['_embedded'] );
+
+		// ?_embed=author,wp:term should return only relevant embeds.
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/posts' );
+		$request->set_param( '_embed', 'author,wp:term' );
+		$response = $this->server->dispatch( $request );
+		$data     = $response->get_data();
+		$data     = array_shift( $data );
+		$embeds   = $this->server->embed_links( $data, $request );
+
+		$this->assertArrayHasKey( 'author', $embeds['_embedded'] );
+		$this->assertArrayNotHasKey( 'replies', $embeds['_embedded'] );
+		$this->assertArrayHasKey( 'wp:term', $embeds['_embedded'] );
+
+		// ?_embed[]=author&_embed[]=replies should return only relevant embeds.
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/posts' );
+		$response = $this->server->dispatch( $request );
+		$request->set_param( '_embed', array( 'author', 'replies' ) );
+		$data     = $response->get_data();
+		$data     = array_shift( $data );
+		$embeds   = $this->server->embed_links( $data, $request );
+
+		$this->assertArrayHasKey( 'author', $embeds['_embedded'] );
+		$this->assertArrayHasKey( 'replies', $embeds['_embedded'] );
+		$this->assertArrayNotHasKey( 'wp:term', $embeds['_embedded'] );
+	}
+
 	public function test_get_post_without_permission() {
 		$draft_id = $this->factory->post->create( array(
 			'post_status' => 'draft',
