Come ottenere l'URL dell'avatar invece di un tag IMG HTML quando si usa get_avatar?
Sto utilizzando un plugin chiamato Simple Local Avatars che mi permette di caricare immagini degli autori che vengono memorizzate localmente sul mio server (senza Gravatar). Il plugin funziona correttamente e get_avatar
restituisce l'avatar locale.
Tuttavia, ho bisogno di utilizzare quell'avatar in modi e luoghi diversi e per questo mi serve l'URL dell'immagine dell'avatar locale invece dell'intero tag HTML. Potrei scrivere una funzione wrapper per get_avatar
che utilizza RegEx o SimpleXML per estrarre e restituire solo l'URL, ma mi chiedevo se esiste già un modo per farlo.
La risposta sopra sembra completa, ma ho semplicemente scritto una funzione wrapper e sono andato avanti. Eccola se ti serve (inseriscila in functions.php
):
function get_avatar_url($get_avatar){
preg_match("/src='(.*?)'/i", $get_avatar, $matches);
return $matches[1];
}
e poi usala dove ti serve nei file template in questo modo:
<img src="<?php echo get_avatar_url(get_avatar( $curauth->ID, 150 )); ?>" align="left" class="authorimage" />
È semplicemente più facile.
In questo caso va bene usare RegEx per analizzare l'HTML, perché verrà analizzato solo un tag img
, quindi non sarà troppo costoso.

Una piccola modifica... la funzione get_avatar inserisce l'src tra "" e non tra '', quindi il match sarà null. La regex dovrebbe essere preg_match('/src="(.*?)"/i', $get_avatar, $matches);

grazie @spdaly - spero che il commento spinga l'autore a modificare ;) - grazie aalaap

Se hai risposto alla tua domanda, per favore segnalala come risposta accettata.

Buone notizie per le versioni di WordPress 4.2+
A partire dalla versione 4.2, la pratica funzione get_avatar_url()
, introdotta come feature request nel ticket #21195 alcuni anni fa, è ora inclusa nel core:
/**
* Recupera l'URL dell'avatar.
*
* @since 4.2.0
*
* @param mixed $id_or_email Il Gravatar per cui recuperare un URL. Accetta un user_id, hash md5 di gravatar,
* email utente, oggetto WP_User, oggetto WP_Post o oggetto commento.
* @param array $args {
* Opzionale. Argomenti da restituire invece degli argomenti predefiniti.
*
* @type int $size Altezza e larghezza dell'avatar in pixel. Predefinito 96.
* @type string $default URL per l'immagine predefinita o un tipo predefinito. Accetta '404' (restituisce
* un 404 invece di un'immagine predefinita), 'retro' (8bit), 'monsterid' (mostro),
* 'wavatar' (faccia cartoon), 'indenticon' (il "quilt"), 'mystery', 'mm',
* o 'mysterman' (The Oyster Man), 'blank' (GIF trasparente), o
* 'gravatar_default' (il logo Gravatar). Il predefinito è il valore dell'opzione
* 'avatar_default', con fallback su 'mystery'.
* @type bool $force_default Se mostrare sempre l'immagine predefinita, mai il Gravatar. Predefinito false.
* @type string $rating Quale valutazione mostrare per gli avatar. Accetta 'G', 'PG', 'R', 'X', e sono
* giudicati in quell'ordine. Predefinito è il valore dell'opzione 'avatar_rating'.
* @type string $scheme Schema URL da usare. Vedi set_url_scheme() per i valori accettati.
* Predefinito null.
* @type array $processed_args Quando la funzione restituisce, il valore sarà $args processati/sanificati
* più un "found_avatar" guess. Passa come riferimento. Predefinito null.
* }
* @return false|string L'URL dell'avatar trovato, o false se non è stato possibile trovare un avatar.
*/
function get_avatar_url( $id_or_email, $args = null ) {
$args = get_avatar_data( $id_or_email, $args );
return $args['url'];
}
dove get_avatar_data()
è anche una nuova funzione helper.
Contiene questa parte di codice:
... TAGLIO ...
/**
* Filtra se recuperare l'URL dell'avatar in anticipo.
*
* Passare un valore non nullo nel membro 'url' dell'array restituito
* effettivamente cortocircuita get_avatar_data(), passando il valore attraverso
* il filtro {@see 'get_avatar_data'} e restituendo in anticipo.
*
* @since 4.2.0
*
* @param array $args Argomenti passati a get_avatar_data(), dopo l'elaborazione.
* @param int|object|string $id_or_email Un ID utente, indirizzo email o oggetto commento.
*/
$args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email );
if ( isset( $args['url'] ) && ! is_null( $args['url'] ) ) {
/** Questo filtro è documentato in wp-includes/link-template.php */
return apply_filters( 'get_avatar_data', $args, $id_or_email );
}
... TAGLIO ...
dove possiamo vedere che quando il parametro url
è impostato, i filtri disponibili sono pre_get_avatar_data
e get_avatar_data
.
Dopo l'aggiornamento alla versione 4.2 recentemente, ho avuto un problema con un tema che definiva la propria versione di get_avatar_url()
, senza alcun prefisso per il nome della funzione o un controllo function_exists()
. Quindi questo è un esempio del perché è importante ;-)

Puoi utilizzare il filtro get_avatar
per ottenere tutti i dati relativi all'avatar, incluso l'URL all'interno del markup. Penso che WordPress non abbia una funzione per restituire solo l'URL dell'immagine dell'avatar.
$avatar = "<img alt='{$safe_alt}' src='{$default}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";
apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);
Puoi anche riscrivere questa funzione all'interno di un plugin o di un tema, la funzione è attiva solo se il nome della funzione non è già definito altrove.
if ( ! function_exists( 'get_avatar' ) ) :
Quindi è possibile aggiungere un parametro per restituire solo l'URL dell'immagine, come questo, usa il parametro $url
con TRUE
e otterrai solo l'URL.
/**
* Recupera l'avatar per un utente fornendo un ID utente o un indirizzo email.
*
* @since 2.5
* @param int|string|object $id_or_email Un ID utente, indirizzo email o oggetto commento
* @param int $size Dimensione dell'immagine dell'avatar
* @param string $default URL di un'immagine predefinita da usare se non è disponibile un avatar
* @param string $alt Testo alternativo da usare nel tag immagine. Di default è vuoto
* @param boolean $url, true per ottenere solo l'URL dell'immagine, senza markup
* @return string Tag <img> per l'avatar dell'utente
*/
function get_avatar( $id_or_email, $size = '96', $default = '', $alt = false, $url = FALSE ) {
if ( ! get_option('show_avatars') )
return false;
if ( false === $alt)
$safe_alt = '';
else
$safe_alt = esc_attr( $alt );
if ( !is_numeric($size) )
$size = '96';
$email = '';
if ( is_numeric($id_or_email) ) {
$id = (int) $id_or_email;
$user = get_userdata($id);
if ( $user )
$email = $user->user_email;
} elseif ( is_object($id_or_email) ) {
// Nessun avatar per pingbacks o trackbacks
$allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );
if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) )
return false;
if ( !empty($id_or_email->user_id) ) {
$id = (int) $id_or_email->user_id;
$user = get_userdata($id);
if ( $user)
$email = $user->user_email;
} elseif ( !empty($id_or_email->comment_author_email) ) {
$email = $id_or_email->comment_author_email;
}
} else {
$email = $id_or_email;
}
if ( empty($default) ) {
$avatar_default = get_option('avatar_default');
if ( empty($avatar_default) )
$default = 'mystery';
else
$default = $avatar_default;
}
if ( !empty($email) )
$email_hash = md5( strtolower( trim( $email ) ) );
if ( is_ssl() ) {
$host = 'https://secure.gravatar.com';
} else {
if ( !empty($email) )
$host = sprintf( "http://%d.gravatar.com", ( hexdec( $email_hash[0] ) % 2 ) );
else
$host = 'http://0.gravatar.com';
}
if ( 'mystery' == $default )
$default = "$host/avatar/ad516503a11cd5ca435acc9bb6523536?s={$size}"; // ad516503a11cd5ca435acc9bb6523536 == md5('unknown@gravatar.com')
elseif ( 'blank' == $default )
$default = includes_url('images/blank.gif');
elseif ( !empty($email) && 'gravatar_default' == $default )
$default = '';
elseif ( 'gravatar_default' == $default )
$default = "$host/avatar/?s={$size}";
elseif ( empty($email) )
$default = "$host/avatar/?d=$default&s={$size}";
elseif ( strpos($default, 'http://') === 0 )
$default = add_query_arg( 's', $size, $default );
if ( !empty($email) ) {
$out = "$host/avatar/";
$out .= $email_hash;
$out .= '?s='.$size;
$out .= '&d=' . urlencode( $default );
$rating = get_option('avatar_rating');
if ( !empty( $rating ) )
$out .= "&r={$rating}";
if ( $url )
$avatar = $out;
else
$avatar = "<img alt='{$safe_alt}' src='{$out}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
} else {
if ( $url )
$avatar = $out;
else
$avatar = "<img alt='{$safe_alt}' src='{$default}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";
}
return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);
}
Un'altra piccola variante consiste nel creare l'URL seguendo le regole di Gravatar.
function get_gravatar_url( $email ) {
$hash = md5( strtolower( trim ( $email ) ) );
return 'http://gravatar.com/avatar/' . $hash;
}
Usa questa funzione nel tuo codice con le email degli autori e otterrai l'URL della loro immagine.

Penso che questa sia una versione migliore della risposta di aalaap:
// Nel tuo template ...
$avatar_url = get_avatar_url ( get_the_author_meta('ID'), $size = '50' );
// Ottieni l'URL src dal tag <img> dell'avatar (aggiungi a functions.php)
function get_avatar_url($author_id, $size){
$get_avatar = get_avatar( $author_id, $size );
preg_match("/src='(.*?)'/i", $get_avatar, $matches);
return ( $matches[1] );
}

get_user_meta($userId, 'simple_local_avatar');
Il plugin Simple Local Avatars utilizza i campi meta per memorizzare l'avatar, quindi puoi semplicemente recuperare i valori chiamando get_user_meta
e prendendo il campo 'simple_local_avatar'. Riceverai un array come questo:
array
(
[full] => 'http://...',
[96] => 'http://...',
[32] => 'http://...'
)

Il metodo di alaap non funziona più in WordPress 4.2
Ho trovato una soluzione. Eccola qui e funziona bene:
function my_gravatar_url() { // Ottieni l'email dell'utente
$user_email = get_the_author_meta( 'user_email' );
// Converti l'email in hash md5 e imposta la dimensione dell'immagine a 80 px
$user_gravatar_url = 'http://www.gravatar.com/avatar/' . md5($user_email) . '?s=80';
echo $user_gravatar_url; }
Nel template basta usare:
<?php my_gravatar_url() ?>
Nota: deve essere utilizzato all'interno di un loop.

Poche ore fa, mi stavo chiedendo anche io come fare. Ma presto ho trovato la soluzione e ho creato un plugin, per favore controlla se get_avatar_url($user_id, $size) funziona per te o no. Grazie.
Codice del plugin:
/*
Plugin Name: Get Avatar URL
Plugin URI: https://github.com/faizan1041/get-avatar-url
Description: get_avatar restituisce un'immagine, get_avatar_url ti darà l'URL dell'immagine.
Author: Faizan Ali
Version: 1.0
Author URI: https://github.com/faizan1041/
License: GPL v2+
*/
function get_avatar_url($user_id, $size) {
$avatar_url = get_avatar($user_id, $size);
$doc = new DOMDocument();
$doc->loadHTML($avatar_url);
$xpath = new DOMXPath($doc);
$src = $xpath->evaluate("string(//img/@src)");
return $src;
}
function sc_get_avatar_url( $atts ) {
$atts = shortcode_atts( array(
'email' => '',
'size' => 150
), $atts, 'avatar_url' );
return get_avatar_url($atts['email'],$atts['size']);
}
add_shortcode( 'avatar_url', 'sc_get_avatar_url' );
Utilizzo:
Chiamare la funzione:
get_avatar_url( get_the_author_meta( 'user_email'), 150);
Utilizzo dello shortcode:
do_shortcode('[avatar_url email="' . get_the_author_meta( 'user_email') .'" size=150 ]' );
