wp/wp-includes/blocks/post-template.php
changeset 19 3d72ae0968f4
parent 18 be944660c56a
child 21 48c4eec2b7e6
--- a/wp/wp-includes/blocks/post-template.php	Wed Sep 21 18:19:35 2022 +0200
+++ b/wp/wp-includes/blocks/post-template.php	Tue Sep 27 16:37:53 2022 +0200
@@ -6,6 +6,32 @@
  */
 
 /**
+ * Determines whether a block list contains a block that uses the featured image.
+ *
+ * @param WP_Block_List $inner_blocks Inner block instance.
+ *
+ * @return bool Whether the block list contains a block that uses the featured image.
+ */
+function block_core_post_template_uses_featured_image( $inner_blocks ) {
+	foreach ( $inner_blocks as $block ) {
+		if ( 'core/post-featured-image' === $block->name ) {
+			return true;
+		}
+		if (
+			'core/cover' === $block->name &&
+			! empty( $block->attributes['useFeaturedImage'] )
+		) {
+			return true;
+		}
+		if ( $block->inner_blocks && block_core_post_template_uses_featured_image( $block->inner_blocks ) ) {
+			return true;
+		}
+	}
+
+	return false;
+}
+
+/**
  * Renders the `core/post-template` block on the server.
  *
  * @param array    $attributes Block attributes.
@@ -18,28 +44,24 @@
 	$page_key = isset( $block->context['queryId'] ) ? 'query-' . $block->context['queryId'] . '-page' : 'query-page';
 	$page     = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ];
 
-	$query_args = build_query_vars_from_query_block( $block, $page );
-	// Override the custom query with the global query if needed.
+	// Use global query if needed.
 	$use_global_query = ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] );
 	if ( $use_global_query ) {
 		global $wp_query;
-		if ( $wp_query && isset( $wp_query->query_vars ) && is_array( $wp_query->query_vars ) ) {
-			// Unset `offset` because if is set, $wp_query overrides/ignores the paged parameter and breaks pagination.
-			unset( $query_args['offset'] );
-			$query_args = wp_parse_args( $wp_query->query_vars, $query_args );
-
-			if ( empty( $query_args['post_type'] ) && is_singular() ) {
-				$query_args['post_type'] = get_post_type( get_the_ID() );
-			}
-		}
+		$query = clone $wp_query;
+	} else {
+		$query_args = build_query_vars_from_query_block( $block, $page );
+		$query      = new WP_Query( $query_args );
 	}
 
-	$query = new WP_Query( $query_args );
-
 	if ( ! $query->have_posts() ) {
 		return '';
 	}
 
+	if ( block_core_post_template_uses_featured_image( $block->inner_blocks ) ) {
+		update_post_thumbnail_cache( $query );
+	}
+
 	$classnames = '';
 	if ( isset( $block->context['displayLayout'] ) && isset( $block->context['query'] ) ) {
 		if ( isset( $block->context['displayLayout']['type'] ) && 'flex' === $block->context['displayLayout']['type'] ) {
@@ -52,18 +74,36 @@
 	$content = '';
 	while ( $query->have_posts() ) {
 		$query->the_post();
+
+		// Get an instance of the current Post Template block.
+		$block_instance = $block->parsed_block;
+
+		// Set the block name to one that does not correspond to an existing registered block.
+		// This ensures that for the inner instances of the Post Template block, we do not render any block supports.
+		$block_instance['blockName'] = 'core/null';
+
+		// Render the inner blocks of the Post Template block with `dynamic` set to `false` to prevent calling
+		// `render_callback` and ensure that no wrapper markup is included.
 		$block_content = (
 			new WP_Block(
-				$block->parsed_block,
+				$block_instance,
 				array(
 					'postType' => get_post_type(),
 					'postId'   => get_the_ID(),
 				)
 			)
 		)->render( array( 'dynamic' => false ) );
-		$content      .= "<li>{$block_content}</li>";
+
+		// Wrap the render inner blocks in a `li` element with the appropriate post classes.
+		$post_classes = implode( ' ', get_post_class( 'wp-block-post' ) );
+		$content     .= '<li class="' . esc_attr( $post_classes ) . '">' . $block_content . '</li>';
 	}
 
+	/*
+	 * Use this function to restore the context of the template tags
+	 * from a secondary query loop back to the main query loop.
+	 * Since we use two custom loops, it's safest to always restore.
+	*/
 	wp_reset_postdata();
 
 	return sprintf(