for_users( $ids );
$photos = array();
foreach ( $ids as $id ) {
$photo = isset( $persons[ $id ] ) ? (int) $persons[ $id ]->photo_id : 0;
self::$photos[ $id ] = $photo;
if ( $photo > 0 ) {
$photos[] = $photo;
}
}
if ( array() !== $photos ) {
_prime_post_caches( $photos, false, true );
}
}
public static function reset(): void {
self::$photos = array();
}
public static function html( int $user_id, int $size, string $css_class, bool $lazy = true, ?int $photo = null ): string {
if ( $user_id <= 0 ) {
return '';
}
$photo = $photo ?? self::photo_id( $user_id );
if ( $photo > 0 ) {
$img = wp_get_attachment_image(
$photo,
array( 2 * $size, 2 * $size ),
false,
array(
'alt' => '',
'class' => $css_class,
'width' => (string) $size,
'height' => (string) $size,
'loading' => $lazy ? 'lazy' : 'eager',
)
);
if ( '' !== $img ) {
return $img;
}
}
$local = self::local_url( $user_id, $size );
if ( '' !== $local ) {
return '
';
}
return self::placeholder( self::name( $user_id ), $size, $css_class );
}
public static function url( int $user_id, int $size ): string {
$photo = self::photo_id( $user_id );
if ( $photo > 0 ) {
$src = wp_get_attachment_image_url( $photo, array( 2 * $size, 2 * $size ) );
if ( is_string( $src ) && '' !== $src ) {
return $src;
}
}
$local = self::local_url( $user_id, $size );
if ( '' !== $local ) {
return $local;
}
$svg = '';
return 'data:image/svg+xml;base64,' . base64_encode( $svg ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode -- An inline SVG image, not obfuscation.
}
public static function photo_id( int $user_id ): int {
if ( ! array_key_exists( $user_id, self::$photos ) ) {
self::prime( array( $user_id ) );
}
return self::$photos[ $user_id ] ?? 0;
}
public static function local_url( int $user_id, int $size ): string {
if ( true !== Settings::get( 'gravatar' ) && ! has_filter( 'pre_get_avatar_data' ) && ! has_filter( 'get_avatar_data' ) && ! has_filter( 'get_avatar_url' ) ) {
return '';
}
$data = get_avatar_data(
$user_id,
array(
'size' => 2 * $size,
'default' => true === Settings::get( 'gravatar' ) ? 'mm' : 'blank',
)
);
$url = (string) ( $data['url'] ?? '' );
$host = (string) wp_parse_url( $url, PHP_URL_HOST );
if ( '' === $host ) {
return '';
}
return 1 === preg_match( '/(^|\.)gravatar\.com$/', $host ) && true !== Settings::get( 'gravatar' ) ? '' : $url;
}
public static function placeholder( string $name, int $size, string $css_class ): string {
return ''
. esc_html( self::initials( $name ) ) . '';
}
private static function initials( string $name ): string {
$words = preg_split( '/\s+/u', trim( $name ) );
$initials = '';
foreach ( array_slice( is_array( $words ) ? array_values( array_filter( $words ) ) : array(), 0, 2 ) as $word ) {
$initials .= mb_strtoupper( mb_substr( (string) $word, 0, 1 ) );
}
return '' !== $initials ? $initials : '?';
}
private static function name( int $user_id ): string {
$user = get_userdata( $user_id );
return $user instanceof \WP_User ? (string) $user->display_name : '';
}
}