--- 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(