render_block_core_latest_posts

The timeline below displays how wordpress function render_block_core_latest_posts has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.4

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'ignore_sticky_posts' => true, 'no_found_rows' => true);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (!empty($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $query = new WP_Query();
    $recent_posts = $query->query($args);
    if (isset($attributes['displayFeaturedImage']) && $attributes['displayFeaturedImage']) {
        update_post_thumbnail_cache($query);
    }
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_link = esc_url(get_permalink($post));
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $featured_image = get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => esc_attr($image_style)));
            if ($attributes['addLinkToFeaturedImage']) {
                $featured_image = sprintf('<a href="%1$s" aria-label="%2$s">%3$s</a>', esc_url($post_link), esc_attr($title), $featured_image);
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', esc_attr($image_classes), $featured_image);
        }
        $list_items_markup .= sprintf('<a class="wp-block-latest-posts__post-title" href="%1$s">%2$s</a>', esc_url($post_link), $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', $byline);
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), get_the_date('', $post));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            /*
             * Adds a "Read more" link with screen reader text.
             * [&hellip;] is the default excerpt ending from wp_trim_excerpt() in Core.
             */
            if (str_ends_with($trimmed_excerpt, ' [&hellip;]')) {
                $excerpt_length = (int) apply_filters('excerpt_length', $block_core_latest_posts_excerpt_length);
                if ($excerpt_length <= $block_core_latest_posts_excerpt_length) {
                    $trimmed_excerpt = substr($trimmed_excerpt, 0, -11);
                    $trimmed_excerpt .= sprintf(
                        /* translators: 1: A URL to a post, 2: Hidden accessibility text: Post title */
                        __('… <a href="%1$s" rel="noopener noreferrer">Read more<span class="screen-reader-text">: %2$s</span></a>'),
                        esc_url($post_link),
                        esc_html($title)
                    );
                }
            }
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post($post_content));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $classes = array('wp-block-latest-posts__list');
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $classes[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $classes[] = 'columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $classes[] = 'has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $classes[] = 'has-author';
    }
    if (isset($attributes['style']['elements']['link']['color']['text'])) {
        $classes[] = 'has-link-color';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classes)));
    return sprintf('<ul %1$s>%2$s</ul>', $wrapper_attributes, $list_items_markup);
}

WordPress Version: 6.3

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'ignore_sticky_posts' => true, 'no_found_rows' => true);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $filter_latest_posts_excerpt_more = static function ($more) use ($attributes) {
        $use_excerpt = 'excerpt' === $attributes['displayPostContentRadio'];
        /* translators: %1$s is a URL to a post, excerpt truncation character, default … */
        return $use_excerpt ? sprintf(__(' … <a href="%1$s" rel="noopener noreferrer">Read more</a>'), esc_url(get_permalink())) : $more;
    };
    add_filter('excerpt_more', $filter_latest_posts_excerpt_more);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $query = new WP_Query();
    $recent_posts = $query->query($args);
    if (isset($attributes['displayFeaturedImage']) && $attributes['displayFeaturedImage']) {
        update_post_thumbnail_cache($query);
    }
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_link = esc_url(get_permalink($post));
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $featured_image = get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => esc_attr($image_style)));
            if ($attributes['addLinkToFeaturedImage']) {
                $featured_image = sprintf('<a href="%1$s" aria-label="%2$s">%3$s</a>', esc_url($post_link), esc_attr($title), $featured_image);
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', esc_attr($image_classes), $featured_image);
        }
        $list_items_markup .= sprintf('<a class="wp-block-latest-posts__post-title" href="%1$s">%2$s</a>', esc_url($post_link), $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', $byline);
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), get_the_date('', $post));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post($post_content));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $classes = array('wp-block-latest-posts__list');
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $classes[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $classes[] = 'columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $classes[] = 'has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $classes[] = 'has-author';
    }
    if (isset($attributes['style']['elements']['link']['color']['text'])) {
        $classes[] = 'has-link-color';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classes)));
    return sprintf('<ul %1$s>%2$s</ul>', $wrapper_attributes, $list_items_markup);
}

WordPress Version: 6.2

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'ignore_sticky_posts' => true, 'no_found_rows' => true);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $query = new WP_Query();
    $recent_posts = $query->query($args);
    if (isset($attributes['displayFeaturedImage']) && $attributes['displayFeaturedImage']) {
        update_post_thumbnail_cache($query);
    }
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_link = esc_url(get_permalink($post));
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $featured_image = get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => esc_attr($image_style)));
            if ($attributes['addLinkToFeaturedImage']) {
                $featured_image = sprintf('<a href="%1$s" aria-label="%2$s">%3$s</a>', esc_url($post_link), esc_attr($title), $featured_image);
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', esc_attr($image_classes), $featured_image);
        }
        $list_items_markup .= sprintf('<a class="wp-block-latest-posts__post-title" href="%1$s">%2$s</a>', esc_url($post_link), $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', $byline);
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), get_the_date('', $post));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post($post_content));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $classes = array('wp-block-latest-posts__list');
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $classes[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $classes[] = 'columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $classes[] = 'has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $classes[] = 'has-author';
    }
    if (isset($attributes['style']['elements']['link']['color']['text'])) {
        $classes[] = 'has-link-color';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classes)));
    return sprintf('<ul %1$s>%2$s</ul>', $wrapper_attributes, $list_items_markup);
}

WordPress Version: 6.1

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'ignore_sticky_posts' => true, 'no_found_rows' => true);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $query = new WP_Query();
    $recent_posts = $query->query($args);
    if (isset($attributes['displayFeaturedImage']) && $attributes['displayFeaturedImage']) {
        update_post_thumbnail_cache($query);
    }
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_link = esc_url(get_permalink($post));
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $featured_image = get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => esc_attr($image_style)));
            if ($attributes['addLinkToFeaturedImage']) {
                $featured_image = sprintf('<a href="%1$s" aria-label="%2$s">%3$s</a>', esc_url($post_link), esc_attr($title), $featured_image);
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', esc_attr($image_classes), $featured_image);
        }
        $list_items_markup .= sprintf('<a class="wp-block-latest-posts__post-title" href="%1$s">%2$s</a>', esc_url($post_link), $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', $byline);
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), get_the_date('', $post));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post($post_content));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts__list';
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => $class));
    return sprintf('<ul %1$s>%2$s</ul>', $wrapper_attributes, $list_items_markup);
}

WordPress Version: 7.1

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_link = esc_url(get_permalink($post));
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $featured_image = get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style));
            if ($attributes['addLinkToFeaturedImage']) {
                $featured_image = sprintf('<a href="%1$s">%2$s</a>', $post_link, $featured_image);
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, $featured_image);
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', $post_link, $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', esc_html($byline));
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset')));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', $post_content);
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts__list';
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => $class));
    return sprintf('<ul %1$s>%2$s</ul>', $wrapper_attributes, $list_items_markup);
}

WordPress Version: 5.7

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_link = esc_url(get_permalink($post));
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $featured_image = get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style));
            if ($attributes['addLinkToFeaturedImage']) {
                $featured_image = sprintf('<a href="%1$s">%2$s</a>', $post_link, $featured_image);
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, $featured_image);
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', $post_link, $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', esc_html($byline));
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'))));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts__list';
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => $class));
    return sprintf('<ul %1$s>%2$s</ul>', $wrapper_attributes, $list_items_markup);
}

WordPress Version: 6.3

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_link = esc_url(get_permalink($post));
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $featured_image = get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style));
            if ($attributes['addLinkToFeaturedImage']) {
                $featured_image = sprintf('<a href="%1$s">%2$s</a>', $post_link, $featured_image);
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, $featured_image);
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', $post_link, $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', esc_html($byline));
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset')));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', $post_content);
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts__list';
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => $class));
    return sprintf('<ul %1$s>%2$s</ul>', $wrapper_attributes, $list_items_markup);
}

WordPress Version: 6.2

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_link = esc_url(get_permalink($post));
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $featured_image = get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style));
            if ($attributes['addLinkToFeaturedImage']) {
                $featured_image = sprintf('<a href="%1$s">%2$s</a>', $post_link, $featured_image);
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, $featured_image);
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', $post_link, $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', esc_html($byline));
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'))));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts__list';
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => $class));
    return sprintf('<ul %1$s>%2$s</ul>', $wrapper_attributes, $list_items_markup);
}

WordPress Version: .10

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_link = esc_url(get_permalink($post));
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $featured_image = get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style));
            if ($attributes['addLinkToFeaturedImage']) {
                $featured_image = sprintf('<a href="%1$s">%2$s</a>', $post_link, $featured_image);
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, $featured_image);
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', $post_link, $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', esc_html($byline));
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset')));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', $post_content);
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts__list';
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => $class));
    return sprintf('<ul %1$s>%2$s</ul>', $wrapper_attributes, $list_items_markup);
}

WordPress Version: 5.6

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_link = esc_url(get_permalink($post));
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $featured_image = get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style));
            if ($attributes['addLinkToFeaturedImage']) {
                $featured_image = sprintf('<a href="%1$s">%2$s</a>', $post_link, $featured_image);
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, $featured_image);
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', $post_link, $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', esc_html($byline));
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'))));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts__list';
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => $class));
    return sprintf('<ul %1$s>%2$s</ul>', $wrapper_attributes, $list_items_markup);
}

WordPress Version: 5.4

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style)));
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', esc_html($byline));
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset')));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', $post_content);
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: 5.2

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style)));
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', esc_html($byline));
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'))));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: .10

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style)));
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', esc_html($byline));
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset')));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', $post_content);
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: 5.5

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $post, $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category__in'] = array_column($attributes['categories'], 'id');
    }
    if (isset($attributes['selectedAuthor'])) {
        $args['author'] = $attributes['selectedAuthor'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style)));
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
            $author_display_name = get_the_author_meta('display_name', $post->post_author);
            /* translators: byline. %s: current author. */
            $byline = sprintf(__('by %s'), $author_display_name);
            if (!empty($author_display_name)) {
                $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-author">%1$s</div>', esc_html($byline));
            }
        }
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s</div>', $trimmed_excerpt);
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'))));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['displayAuthor']) && $attributes['displayAuthor']) {
        $class .= ' has-author';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: 4.5

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category'] = $attributes['categories'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style)));
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s', $trimmed_excerpt);
            if (strpos($trimmed_excerpt, ' &hellip; ') !== false) {
                $list_items_markup .= sprintf('<a href="%1$s">%2$s</a></div>', esc_url(get_permalink($post)), __('Read more'));
            } else {
                $list_items_markup .= sprintf('</div>');
            }
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset')));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', $post_content);
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: 4.2

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category'] = $attributes['categories'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style)));
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s', $trimmed_excerpt);
            if (strpos($trimmed_excerpt, ' &hellip; ') !== false) {
                $list_items_markup .= sprintf('<a href="%1$s">%2$s</a></div>', esc_url(get_permalink($post)), __('Read more'));
            } else {
                $list_items_markup .= sprintf('</div>');
            }
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'))));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: .10

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category'] = $attributes['categories'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style)));
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s', $trimmed_excerpt);
            if (strpos($trimmed_excerpt, ' &hellip; ') !== false) {
                $list_items_markup .= sprintf('<a href="%1$s">%2$s</a></div>', esc_url(get_permalink($post)), __('Read more'));
            } else {
                $list_items_markup .= sprintf('</div>');
            }
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset')));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', $post_content);
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: 5.4

/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    global $block_core_latest_posts_excerpt_length;
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    $block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
    add_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    if (isset($attributes['categories'])) {
        $args['category'] = $attributes['categories'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $list_items_markup .= '<li>';
        if ($attributes['displayFeaturedImage'] && has_post_thumbnail($post)) {
            $image_style = '';
            if (isset($attributes['featuredImageSizeWidth'])) {
                $image_style .= sprintf('max-width:%spx;', $attributes['featuredImageSizeWidth']);
            }
            if (isset($attributes['featuredImageSizeHeight'])) {
                $image_style .= sprintf('max-height:%spx;', $attributes['featuredImageSizeHeight']);
            }
            $image_classes = 'wp-block-latest-posts__featured-image';
            if (isset($attributes['featuredImageAlign'])) {
                $image_classes .= ' align' . $attributes['featuredImageAlign'];
            }
            $list_items_markup .= sprintf('<div class="%1$s">%2$s</div>', $image_classes, get_the_post_thumbnail($post, $attributes['featuredImageSizeSlug'], array('style' => $image_style)));
        }
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $trimmed_excerpt = get_the_excerpt($post);
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s', $trimmed_excerpt);
            if (strpos($trimmed_excerpt, ' &hellip; ') !== false) {
                $list_items_markup .= sprintf('<a href="%1$s">%2$s</a></div>', esc_url(get_permalink($post)), __('Read more'));
            } else {
                $list_items_markup .= sprintf('</div>');
            }
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'))));
        }
        $list_items_markup .= "</li>\n";
    }
    remove_filter('excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20);
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: 3.7

/**
 * Server-side rendering of the `core/latest-posts` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    if (isset($attributes['categories'])) {
        $args['category'] = $attributes['categories'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    $excerpt_length = $attributes['excerptLength'];
    foreach ($recent_posts as $post) {
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<li><a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $post_excerpt = $post->post_excerpt;
            if (!$post_excerpt) {
                $post_excerpt = $post->post_content;
            }
            $trimmed_excerpt = esc_html(wp_trim_words($post_excerpt, $excerpt_length, ' &hellip; '));
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s', $trimmed_excerpt);
            if (strpos($trimmed_excerpt, ' &hellip; ') !== false) {
                $list_items_markup .= sprintf('<a href="%1$s">%2$s</a></div>', esc_url(get_permalink($post)), __('Read more'));
            } else {
                $list_items_markup .= sprintf('</div>');
            }
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset')));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', $post_content);
        }
        $list_items_markup .= "</li>\n";
    }
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: 3.2

/**
 * Server-side rendering of the `core/latest-posts` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    if (isset($attributes['categories'])) {
        $args['category'] = $attributes['categories'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    $excerpt_length = $attributes['excerptLength'];
    foreach ($recent_posts as $post) {
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<li><a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $post_excerpt = $post->post_excerpt;
            if (!$post_excerpt) {
                $post_excerpt = $post->post_content;
            }
            $trimmed_excerpt = esc_html(wp_trim_words($post_excerpt, $excerpt_length, ' &hellip; '));
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s', $trimmed_excerpt);
            if (strpos($trimmed_excerpt, ' &hellip; ') !== false) {
                $list_items_markup .= sprintf('<a href="%1$s">%2$s</a></div>', esc_url(get_permalink($post)), __('Read more'));
            } else {
                $list_items_markup .= sprintf('</div>');
            }
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'))));
        }
        $list_items_markup .= "</li>\n";
    }
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: .10

/**
 * Server-side rendering of the `core/latest-posts` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    if (isset($attributes['categories'])) {
        $args['category'] = $attributes['categories'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    $excerpt_length = $attributes['excerptLength'];
    foreach ($recent_posts as $post) {
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<li><a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $post_excerpt = $post->post_excerpt;
            if (!$post_excerpt) {
                $post_excerpt = $post->post_content;
            }
            $trimmed_excerpt = esc_html(wp_trim_words($post_excerpt, $excerpt_length, ' &hellip; '));
            if (post_password_required($post)) {
                $trimmed_excerpt = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s', $trimmed_excerpt);
            if (strpos($trimmed_excerpt, ' &hellip; ') !== false) {
                $list_items_markup .= sprintf('<a href="%1$s">%2$s</a></div>', esc_url(get_permalink($post)), __('Read more'));
            } else {
                $list_items_markup .= sprintf('</div>');
            }
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $post_content = wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset')));
            if (post_password_required($post)) {
                $post_content = __('This content is password protected.');
            }
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', $post_content);
        }
        $list_items_markup .= "</li>\n";
    }
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: 5.3

/**
 * Server-side rendering of the `core/latest-posts` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    if (isset($attributes['categories'])) {
        $args['category'] = $attributes['categories'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    $excerpt_length = $attributes['excerptLength'];
    foreach ($recent_posts as $post) {
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(no title)');
        }
        $list_items_markup .= sprintf('<li><a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'excerpt' === $attributes['displayPostContentRadio']) {
            $post_excerpt = $post->post_excerpt;
            if (!$post_excerpt) {
                $post_excerpt = $post->post_content;
            }
            $trimmed_excerpt = esc_html(wp_trim_words($post_excerpt, $excerpt_length, ' &hellip; '));
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-excerpt">%1$s', $trimmed_excerpt);
            if (strpos($trimmed_excerpt, ' &hellip; ') !== false) {
                $list_items_markup .= sprintf('<a href="%1$s">%2$s</a></div>', esc_url(get_permalink($post)), __('Read more'));
            } else {
                $list_items_markup .= sprintf('</div>');
            }
        }
        if (isset($attributes['displayPostContent']) && $attributes['displayPostContent'] && isset($attributes['displayPostContentRadio']) && 'full_post' === $attributes['displayPostContentRadio']) {
            $list_items_markup .= sprintf('<div class="wp-block-latest-posts__post-full-content">%1$s</div>', wp_kses_post(html_entity_decode($post->post_content, ENT_QUOTES, get_option('blog_charset'))));
        }
        $list_items_markup .= "</li>\n";
    }
    $class = 'wp-block-latest-posts wp-block-latest-posts__list';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
}

WordPress Version: 5.2

/**
 * Server-side rendering of the `core/latest-posts` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    $args = array('posts_per_page' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy'], 'suppress_filters' => false);
    if (isset($attributes['categories'])) {
        $args['category'] = $attributes['categories'];
    }
    $recent_posts = get_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $title = get_the_title($post);
        if (!$title) {
            $title = __('(Untitled)');
        }
        $list_items_markup .= sprintf('<li><a href="%1$s">%2$s</a>', esc_url(get_permalink($post)), $title);
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post)), esc_html(get_the_date('', $post)));
        }
        $list_items_markup .= "</li>\n";
    }
    $class = 'wp-block-latest-posts';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    $block_content = sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
    return $block_content;
}

WordPress Version: 5.0

/**
 * Server-side rendering of the `core/latest-posts` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/latest-posts` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the post content with latest posts added.
 */
function render_block_core_latest_posts($attributes)
{
    $args = array('numberposts' => $attributes['postsToShow'], 'post_status' => 'publish', 'order' => $attributes['order'], 'orderby' => $attributes['orderBy']);
    if (isset($attributes['categories'])) {
        $args['category'] = $attributes['categories'];
    }
    $recent_posts = wp_get_recent_posts($args);
    $list_items_markup = '';
    foreach ($recent_posts as $post) {
        $post_id = $post['ID'];
        $title = get_the_title($post_id);
        if (!$title) {
            $title = __('(Untitled)');
        }
        $list_items_markup .= sprintf('<li><a href="%1$s">%2$s</a>', esc_url(get_permalink($post_id)), esc_html($title));
        if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
            $list_items_markup .= sprintf('<time datetime="%1$s" class="wp-block-latest-posts__post-date">%2$s</time>', esc_attr(get_the_date('c', $post_id)), esc_html(get_the_date('', $post_id)));
        }
        $list_items_markup .= "</li>\n";
    }
    $class = 'wp-block-latest-posts';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['postLayout']) && 'grid' === $attributes['postLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['postLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['displayPostDate']) && $attributes['displayPostDate']) {
        $class .= ' has-dates';
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    $block_content = sprintf('<ul class="%1$s">%2$s</ul>', esc_attr($class), $list_items_markup);
    return $block_content;
}