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 = '' . '' . esc_html( self::initials( self::name( $user_id ) ) ) . ''; 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 ''; } 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 : ''; } }