2019-03-07 10:12:51 +01:00
< ? php
/**
* 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 ) {
2022-04-12 17:12:47 +02:00
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>' ;
}
2019-03-07 10:12:51 +01:00
$rss = fetch_feed ( $attributes [ 'feedURL' ] );
if ( is_wp_error ( $rss ) ) {
2022-10-18 15:56:02 +02:00
return '<div class="components-placeholder"><div class="notice notice-error"><strong>' . __ ( 'RSS Error:' ) . '</strong> ' . esc_html ( $rss -> get_error_message () ) . '</div></div>' ;
2019-03-07 10:12:51 +01:00
}
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 ) ) {
2019-09-19 17:47:58 +02:00
$title = __ ( '(no title)' );
2019-03-07 10:12:51 +01:00
}
$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> ' ,
2023-02-07 08:04:52 +01:00
esc_attr ( date_i18n ( 'c' , $date ) ),
2022-10-18 15:56:02 +02:00
esc_attr ( date_i18n ( get_option ( 'date_format' ), $date ) )
2019-03-07 10:12:51 +01:00
);
}
}
$author = '' ;
if ( $attributes [ 'displayAuthor' ] ) {
$author = $item -> get_author ();
if ( is_object ( $author ) ) {
$author = $author -> get_name ();
2020-07-27 22:10:36 +02:00
$author = '<span class="wp-block-rss__item-author">' . sprintf (
/* translators: %s: the author. */
__ ( 'by %s' ),
esc_html ( strip_tags ( $author ) )
) . '</span>' ;
2019-03-07 10:12:51 +01:00
}
}
$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' ], ' […]' ) );
// Change existing [...] to […].
2019-09-19 17:47:58 +02:00
if ( '[...]' === substr ( $excerpt , - 5 ) ) {
2019-03-07 10:12:51 +01:00
$excerpt = substr ( $excerpt , 0 , - 5 ) . '[…]' ;
}
$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> " ;
}
2020-10-13 15:10:30 +02:00
$classnames = array ();
2019-09-19 17:47:58 +02:00
if ( isset ( $attributes [ 'blockLayout' ] ) && 'grid' === $attributes [ 'blockLayout' ] ) {
2020-10-13 15:10:30 +02:00
$classnames [] = 'is-grid' ;
2019-09-19 17:47:58 +02:00
}
if ( isset ( $attributes [ 'columns' ] ) && 'grid' === $attributes [ 'blockLayout' ] ) {
2020-10-13 15:10:30 +02:00
$classnames [] = 'columns-' . $attributes [ 'columns' ];
2019-09-19 17:47:58 +02:00
}
2022-04-12 17:12:47 +02:00
if ( $attributes [ 'displayDate' ] ) {
$classnames [] = 'has-dates' ;
}
if ( $attributes [ 'displayAuthor' ] ) {
$classnames [] = 'has-authors' ;
}
if ( $attributes [ 'displayExcerpt' ] ) {
$classnames [] = 'has-excerpts' ;
}
2020-10-20 15:36:16 +02:00
$wrapper_attributes = get_block_wrapper_attributes ( array ( 'class' => implode ( ' ' , $classnames ) ) );
2019-09-19 17:47:58 +02:00
2020-10-20 15:36:16 +02:00
return sprintf ( '<ul %s>%s</ul>' , $wrapper_attributes , $list_items );
2019-03-07 10:12:51 +01:00
}
/**
* Registers the `core/rss` block on server .
*/
function register_block_core_rss () {
2020-06-26 15:33:47 +02:00
register_block_type_from_metadata (
__DIR__ . '/rss' ,
2019-03-07 10:12:51 +01:00
array (
'render_callback' => 'render_block_core_rss' ,
)
);
}
add_action ( 'init' , 'register_block_core_rss' );