Come ottenere l'URL dell'avatar invece di un tag IMG HTML quando si usa get_avatar?

24 lug 2012, 11:05:13
Visualizzazioni: 54.9K
Voti: 28

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.

0
Tutte le risposte alla domanda 8
4
25

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.

25 lug 2012 14:35:04
Commenti

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);

spdaly spdaly
17 set 2014 15:43:10

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

Sagive Sagive
21 dic 2014 05:04:47

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

user9447 user9447
1 ago 2016 20:20:53

@Darth_Vader Non sono più tornato su questo argomento da quando ho pubblicato la domanda, quindi non sono più sicuro che questo sia il modo ideale per farlo. Penso che la nuova risposta riguardante la versione 4.2+ sia migliore.

aalaap aalaap
2 ago 2016 07:02:15
0
25

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 ;-)

14 mag 2015 02:23:21
0

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&amp;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 .= '&amp;d=' . urlencode( $default );

        $rating = get_option('avatar_rating');
        if ( !empty( $rating ) )
            $out .= "&amp;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.

24 lug 2012 11:31:26
0

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] );
}
25 mar 2014 21:36:52
0
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://...'
)
15 apr 2015 23:13:40
0

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.

25 apr 2015 06:57:39
0

Quando l'avatar è stato caricato localmente, WP restituisce il tag img con l'attributo src tra virgolette doppie, quindi ho scoperto che questo pattern funziona meglio:

preg_match("/src=['\"](.*?)['\"]/i", $get_avatar, $matches);
27 nov 2014 08:37:01
0

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 ]' );
14 dic 2014 21:41:40