diff -r 7b1b88e27a20 -r 48c4eec2b7e6 wp/wp-includes/blocks/avatar.php --- a/wp/wp-includes/blocks/avatar.php Thu Sep 29 08:06:27 2022 +0200 +++ b/wp/wp-includes/blocks/avatar.php Fri Sep 05 18:40:08 2025 +0200 @@ -8,6 +8,8 @@ /** * Renders the `core/avatar` block on the server. * + * @since 6.0.0 + * * @param array $attributes Block attributes. * @param string $content Block default content. * @param WP_Block $block Block instance. @@ -16,70 +18,33 @@ function render_block_core_avatar( $attributes, $content, $block ) { $size = isset( $attributes['size'] ) ? $attributes['size'] : 96; $wrapper_attributes = get_block_wrapper_attributes(); - - $image_styles = array(); - - // Add border width styles. - $has_border_width = ! empty( $attributes['style']['border']['width'] ); + $border_attributes = get_block_core_avatar_border_attributes( $attributes ); - if ( $has_border_width ) { - $border_width = $attributes['style']['border']['width']; - $image_styles[] = sprintf( 'border-width: %s;', esc_attr( $border_width ) ); - } - - // Add border radius styles. - $has_border_radius = ! empty( $attributes['style']['border']['radius'] ); - - if ( $has_border_radius ) { - $border_radius = $attributes['style']['border']['radius']; + // Class gets passed through `esc_attr` via `get_avatar`. + $image_classes = ! empty( $border_attributes['class'] ) + ? "wp-block-avatar__image {$border_attributes['class']}" + : 'wp-block-avatar__image'; - if ( is_array( $border_radius ) ) { - // Apply styles for individual corner border radii. - foreach ( $border_radius as $key => $value ) { - if ( null !== $value ) { - $name = _wp_to_kebab_case( $key ); - // Add shared styles for individual border radii. - $border_style = sprintf( - 'border-%s-radius: %s;', - esc_attr( $name ), - esc_attr( $value ) - ); - $image_styles[] = $border_style; - } - } - } else { - $border_style = sprintf( 'border-radius: %s;', esc_attr( $border_radius ) ); - $image_styles[] = $border_style; - } - } - - // Add border color styles. - $has_border_color = ! empty( $attributes['style']['border']['color'] ); - - if ( $has_border_color ) { - $border_color = $attributes['style']['border']['color']; - $image_styles[] = sprintf( 'border-color: %s;', esc_attr( $border_color ) ); - } - - // Add border style (solid, dashed, dotted ). - $has_border_style = ! empty( $attributes['style']['border']['style'] ); - - if ( $has_border_style ) { - $border_style = $attributes['style']['border']['style']; - $image_styles[] = sprintf( 'border-style: %s;', esc_attr( $border_style ) ); - } - - // Add border classes to the avatar image for both custom colors and palette colors. - $image_classes = ''; - if ( $has_border_color || isset( $attributes['borderColor'] ) ) { - $image_classes .= 'has-border-color'; - } - if ( isset( $attributes['borderColor'] ) ) { - $image_classes .= ' has-' . $attributes['borderColor'] . '-border-color'; - } + // Unlike class, `get_avatar` doesn't filter the styles via `esc_attr`. + // The style engine does pass the border styles through + // `safecss_filter_attr` however. + $image_styles = ! empty( $border_attributes['style'] ) + ? sprintf( ' style="%s"', esc_attr( $border_attributes['style'] ) ) + : ''; if ( ! isset( $block->context['commentId'] ) ) { - $author_id = isset( $attributes['userId'] ) ? $attributes['userId'] : get_post_field( 'post_author', $block->context['postId'] ); + if ( isset( $attributes['userId'] ) ) { + $author_id = $attributes['userId']; + } elseif ( isset( $block->context['postId'] ) ) { + $author_id = get_post_field( 'post_author', $block->context['postId'] ); + } else { + $author_id = get_query_var( 'author' ); + } + + if ( empty( $author_id ) ) { + return ''; + } + $author_name = get_the_author_meta( 'display_name', $author_id ); // translators: %s is the Author name. $alt = sprintf( __( '%s Avatar' ), $author_name ); @@ -89,51 +54,107 @@ '', $alt, array( - 'extra_attr' => isset( $image_styles ) ? sprintf( ' style="%s"', safecss_filter_attr( implode( ' ', $image_styles ) ) ) : '', - 'class' => "wp-block-avatar__image $image_classes ", + 'extra_attr' => $image_styles, + 'class' => $image_classes, ) ); if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) { $label = ''; if ( '_blank' === $attributes['linkTarget'] ) { // translators: %s is the Author name. - $label = 'aria-label="' . sprintf( esc_attr__( '(%s author archive, opens in a new tab)' ), $author_name ) . '"'; + $label = 'aria-label="' . esc_attr( sprintf( __( '(%s author archive, opens in a new tab)' ), $author_name ) ) . '"'; } // translators: %1$s: Author archive link. %2$s: Link target. %3$s Aria label. %4$s Avatar image. - $avatar_block = sprintf( '%4$s', get_author_posts_url( $author_id ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block ); + $avatar_block = sprintf( '%4$s', esc_url( get_author_posts_url( $author_id ) ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block ); } return sprintf( '