diff -r 7b1b88e27a20 -r 48c4eec2b7e6 wp/wp-includes/blocks/latest-posts.php --- a/wp/wp-includes/blocks/latest-posts.php Thu Sep 29 08:06:27 2022 +0200 +++ b/wp/wp-includes/blocks/latest-posts.php Fri Sep 05 18:40:08 2025 +0200 @@ -18,6 +18,8 @@ * Callback for the excerpt_length filter used by * the Latest Posts block at render time. * + * @since 5.4.0 + * * @return int Returns the global $block_core_latest_posts_excerpt_length variable * to allow the excerpt_length filter respect the Latest Block setting. */ @@ -29,6 +31,8 @@ /** * Renders the `core/latest-posts` block on server. * + * @since 5.0.0 + * * @param array $attributes The block attributes. * * @return string Returns the post content with latest posts added. @@ -48,14 +52,14 @@ $block_core_latest_posts_excerpt_length = $attributes['excerptLength']; add_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 ); - if ( isset( $attributes['categories'] ) ) { + if ( ! empty( $attributes['categories'] ) ) { $args['category__in'] = array_column( $attributes['categories'], 'id' ); } if ( isset( $attributes['selectedAuthor'] ) ) { $args['author'] = $attributes['selectedAuthor']; } - $query = new WP_Query; + $query = new WP_Query(); $recent_posts = $query->query( $args ); if ( isset( $attributes['displayFeaturedImage'] ) && $attributes['displayFeaturedImage'] ) { @@ -143,6 +147,24 @@ $trimmed_excerpt = get_the_excerpt( $post ); + /* + * Adds a "Read more" link with screen reader text. + * […] is the default excerpt ending from wp_trim_excerpt() in Core. + */ + if ( str_ends_with( $trimmed_excerpt, ' […]' ) ) { + /** This filter is documented in wp-includes/formatting.php */ + $excerpt_length = (int) apply_filters( 'excerpt_length', $block_core_latest_posts_excerpt_length ); + if ( $excerpt_length <= $block_core_latest_posts_excerpt_length ) { + $trimmed_excerpt = substr( $trimmed_excerpt, 0, -11 ); + $trimmed_excerpt .= sprintf( + /* translators: 1: A URL to a post, 2: Hidden accessibility text: Post title */ + __( '… Read more: %2$s' ), + esc_url( $post_link ), + esc_html( $title ) + ); + } + } + if ( post_password_required( $post ) ) { $trimmed_excerpt = __( 'This content is password protected.' ); } @@ -173,25 +195,24 @@ remove_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 ); - $class = 'wp-block-latest-posts__list'; - + $classes = array( 'wp-block-latest-posts__list' ); if ( isset( $attributes['postLayout'] ) && 'grid' === $attributes['postLayout'] ) { - $class .= ' is-grid'; + $classes[] = 'is-grid'; + } + if ( isset( $attributes['columns'] ) && 'grid' === $attributes['postLayout'] ) { + $classes[] = 'columns-' . $attributes['columns']; } - - if ( isset( $attributes['columns'] ) && 'grid' === $attributes['postLayout'] ) { - $class .= ' columns-' . $attributes['columns']; + if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) { + $classes[] = 'has-dates'; + } + if ( isset( $attributes['displayAuthor'] ) && $attributes['displayAuthor'] ) { + $classes[] = 'has-author'; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; } - if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) { - $class .= ' has-dates'; - } - - if ( isset( $attributes['displayAuthor'] ) && $attributes['displayAuthor'] ) { - $class .= ' has-author'; - } - - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class ) ); + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return sprintf( '