render_block_core_rss

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

WordPress Version: 6.2

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    if (in_array(untrailingslashit($attributes['feedURL']), array(site_url(), home_url()), true)) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('Adding an RSS feed to this site’s homepage is not supported, as it could lead to a loop that slows down your site. Try using another block, like the <strong>Latest Posts</strong> block, to list posts from the site.') . '</div></div>';
    }
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n('c', $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    if ($attributes['displayDate']) {
        $classnames[] = 'has-dates';
    }
    if ($attributes['displayAuthor']) {
        $classnames[] = 'has-authors';
    }
    if ($attributes['displayExcerpt']) {
        $classnames[] = 'has-excerpts';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: 6.1

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    if (in_array(untrailingslashit($attributes['feedURL']), array(site_url(), home_url()), true)) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('Adding an RSS feed to this site’s homepage is not supported, as it could lead to a loop that slows down your site. Try using another block, like the <strong>Latest Posts</strong> block, to list posts from the site.') . '</div></div>';
    }
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    if ($attributes['displayDate']) {
        $classnames[] = 'has-dates';
    }
    if ($attributes['displayAuthor']) {
        $classnames[] = 'has-authors';
    }
    if ($attributes['displayExcerpt']) {
        $classnames[] = 'has-excerpts';
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: 9.5

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: 5.9

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: 8.6

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: 5.8

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: 7.8

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: 7.2

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: .10

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: 6.2

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: .10

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: 5.6

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classnames = array();
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $classnames[] = 'columns-' . $attributes['columns'];
    }
    $wrapper_attributes = get_block_wrapper_attributes(array('class' => implode(' ', $classnames)));
    return sprintf('<ul %s>%s</ul>', $wrapper_attributes, $list_items);
}

WordPress Version: 5.2

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%s">%s</ul>', esc_attr($class), $list_items);
}

WordPress Version: .11

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%s">%s</ul>', esc_attr($class), $list_items);
}

WordPress Version: 5.5

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . sprintf(
                    /* translators: %s: the author. */
                    __('by %s'),
                    esc_html(strip_tags($author))
                ) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf('<ul class="%s">%s</ul>', esc_attr($class), $list_items);
}

WordPress Version: 4.2

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf("<ul class='%s'>%s</ul>", esc_attr($class), $list_items);
}

WordPress Version: .12

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf("<ul class='%s'>%s</ul>", esc_attr($class), $list_items);
}

WordPress Version: 4.1

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return sprintf("<ul class='%s'>%s</ul>", esc_attr($class), $list_items);
}

WordPress Version: 5.4

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    return "<ul class='{$class}'>{$list_items}</ul>";
}

WordPress Version: 3.4

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    $list_items_markup = sprintf("<ul class='%s'>%s</ul>", esc_attr($class), $list_items);
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: 3.2

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    $list_items_markup = "<ul class='{$class}'>{$list_items}</ul>";
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: .14

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    $list_items_markup = sprintf("<ul class='%s'>%s</ul>", esc_attr($class), $list_items);
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: .10

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    $list_items_markup = sprintf("<ul class='%s'>%s</ul>", esc_attr($class), $list_items);
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: 5.3

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(no title)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' === substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $class = 'wp-block-rss';
    if (isset($attributes['align'])) {
        $class .= ' align' . $attributes['align'];
    }
    if (isset($attributes['blockLayout']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' is-grid';
    }
    if (isset($attributes['columns']) && 'grid' === $attributes['blockLayout']) {
        $class .= ' columns-' . $attributes['columns'];
    }
    if (isset($attributes['className'])) {
        $class .= ' ' . $attributes['className'];
    }
    $list_items_markup = "<ul class='{$class}'>{$list_items}</ul>";
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: 2.7

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(Untitled)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' == substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classes = ('grid' === $attributes['blockLayout']) ? ' is-grid columns-' . $attributes['columns'] : '';
    $list_items_markup = sprintf("<ul class='%s'>%s</ul>", esc_attr($class), $list_items);
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: 2.3

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(Untitled)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' == substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classes = ('grid' === $attributes['blockLayout']) ? ' is-grid columns-' . $attributes['columns'] : '';
    $list_items_markup = "<ul class='wp-block-rss{$classes}'>{$list_items}</ul>";
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: .20

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(Untitled)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' == substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classes = ('grid' === $attributes['blockLayout']) ? ' is-grid columns-' . $attributes['columns'] : '';
    $list_items_markup = sprintf("<ul class='%s'>%s</ul>", esc_attr($classes), $list_items);
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: 2.2

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(Untitled)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' == substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classes = ('grid' === $attributes['blockLayout']) ? ' is-grid columns-' . $attributes['columns'] : '';
    $list_items_markup = "<ul class='wp-block-rss{$classes}'>{$list_items}</ul>";
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: .17

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . esc_html($rss->get_error_message()) . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(Untitled)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', esc_attr(date_i18n(get_option('c'), $date)), esc_attr(date_i18n(get_option('date_format'), $date)));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' == substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classes = ('grid' === $attributes['blockLayout']) ? ' is-grid columns-' . $attributes['columns'] : '';
    $list_items_markup = sprintf("<ul class='%s'>%s</ul>", esc_attr($classes), $list_items);
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: .10

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(Untitled)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' == substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classes = ('grid' === $attributes['blockLayout']) ? ' is-grid columns-' . $attributes['columns'] : '';
    $list_items_markup = sprintf("<ul class='%s'>%s</ul>", esc_attr($classes), $list_items);
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}

WordPress Version: 5.2

/**
 * Server-side rendering of the `core/rss` block.
 *
 * @package WordPress
 */
/**
 * Renders the `core/rss` block on server.
 *
 * @param array $attributes The block attributes.
 *
 * @return string Returns the block content with received rss items.
 */
function render_block_core_rss($attributes)
{
    $rss = fetch_feed($attributes['feedURL']);
    if (is_wp_error($rss)) {
        return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __('RSS Error:') . '</strong> ' . $rss->get_error_message() . '</div></div>';
    }
    if (!$rss->get_item_quantity()) {
        // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
        $rss->__destruct();
        unset($rss);
        return '<div class="components-placeholder"><div class="notice notice-error">' . __('An error has occurred, which probably means the feed is down. Try again later.') . '</div></div>';
    }
    $rss_items = $rss->get_items(0, $attributes['itemsToShow']);
    $list_items = '';
    foreach ($rss_items as $item) {
        $title = esc_html(trim(strip_tags($item->get_title())));
        if (empty($title)) {
            $title = __('(Untitled)');
        }
        $link = $item->get_link();
        $link = esc_url($link);
        if ($link) {
            $title = "<a href='{$link}'>{$title}</a>";
        }
        $title = "<div class='wp-block-rss__item-title'>{$title}</div>";
        $date = '';
        if ($attributes['displayDate']) {
            $date = $item->get_date('U');
            if ($date) {
                $date = sprintf('<time datetime="%1$s" class="wp-block-rss__item-publish-date">%2$s</time> ', date_i18n(get_option('c'), $date), date_i18n(get_option('date_format'), $date));
            }
        }
        $author = '';
        if ($attributes['displayAuthor']) {
            $author = $item->get_author();
            if (is_object($author)) {
                $author = $author->get_name();
                $author = '<span class="wp-block-rss__item-author">' . __('by') . ' ' . esc_html(strip_tags($author)) . '</span>';
            }
        }
        $excerpt = '';
        if ($attributes['displayExcerpt']) {
            $excerpt = html_entity_decode($item->get_description(), ENT_QUOTES, get_option('blog_charset'));
            $excerpt = esc_attr(wp_trim_words($excerpt, $attributes['excerptLength'], ' [&hellip;]'));
            // Change existing [...] to [&hellip;].
            if ('[...]' == substr($excerpt, -5)) {
                $excerpt = substr($excerpt, 0, -5) . '[&hellip;]';
            }
            $excerpt = '<div class="wp-block-rss__item-excerpt">' . esc_html($excerpt) . '</div>';
        }
        $list_items .= "<li class='wp-block-rss__item'>{$title}{$date}{$author}{$excerpt}</li>";
    }
    $classes = ('grid' === $attributes['blockLayout']) ? ' is-grid columns-' . $attributes['columns'] : '';
    $list_items_markup = "<ul class='wp-block-rss{$classes}'>{$list_items}</ul>";
    // PHP 5.2 compatibility. See: http://simplepie.org/wiki/faq/i_m_getting_memory_leaks.
    $rss->__destruct();
    unset($rss);
    return $list_items_markup;
}