Cum obțin URL-ul avatarului în loc de un tag HTML IMG când folosesc get_avatar?

24 iul. 2012, 11:05:13
Vizualizări: 54.9K
Voturi: 28

Folosesc un plugin numit Simple Local Avatars care îmi permite să încarc imagini pentru autori care sunt stocate local pe serverul meu (fără Gravatar). Plugin-ul funcționează bine și get_avatar returnează avatarul local.

Cu toate acestea, am nevoie să folosesc acel avatar în diferite moduri și în diferite locuri și pentru asta am nevoie de URL-ul imaginii avatarului local în loc de întregul tag HTML. Aș putea scrie o funcție wrapper pentru get_avatar care să folosească RegEx sau SimpleXML pentru a extrage și returna doar URL-ul, dar mă întrebam dacă există vreo modalitate existentă pentru a face acest lucru.

0
Toate răspunsurile la întrebare 8
4
25

Răspunsul de mai sus pare cuprinzător, dar eu am scris pur și simplu o funcție wrapper și am trecut mai departe. Iată-o dacă ai nevoie de ea (pune asta în functions.php):

function get_avatar_url($get_avatar){
    preg_match("/src='(.*?)'/i", $get_avatar, $matches);
    return $matches[1];
}

și apoi folosește-o oriunde ai nevoie în fișierele de template astfel:

<img src="<?php echo get_avatar_url(get_avatar( $curauth->ID, 150 )); ?>" align="left" class="authorimage" />

Este mult mai simplu.

Folosirea RegEx pentru a analiza HTML în acest caz este acceptabilă, deoarece va analiza doar un singur tag img, așa că nu va fi prea costisitor.

25 iul. 2012 14:35:04
Comentarii

O mică modificare... funcția get_avatar pune src între ghilimele " nu apostroafe ', astfel încât potrivirea va fi null. Regex-ul ar trebui să fie preg_match('/src="(.*?)"/i', $get_avatar, $matches);

spdaly spdaly
17 sept. 2014 15:43:10

mulțumesc @spdaly - sper că comentariul va determina autorul să editeze ;) - mulțumesc aalaap

Sagive Sagive
21 dec. 2014 05:04:47

Dacă ți-ai răspuns singur la întrebare, te rog să o marchezi ca răspuns acceptat.

user9447 user9447
1 aug. 2016 20:20:53

@Darth_Vader Nu m-am mai întors la acest lucru de când am postat întrebarea, așa că nu mai sunt sigur dacă aceasta este cea mai bună metodă. Cred că noul răspuns despre versiunea 4.2+ este mai bun.

aalaap aalaap
2 aug. 2016 07:02:15
0
25

Veste bună pentru versiunile WordPress 4.2+

Începând cu versiunea 4.2, funcția utilă get_avatar_url(), introdusă ca o cerință de funcționalitate în tichetul #21195 acum câțiva ani, acum este inclusă în nucleu:

/**
 * Obține URL-ul avatarului.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email Gravatarul pentru care se obține URL-ul. Acceptă un user_id, hash md5 gravatar,
 *                           email utilizator, obiect WP_User, obiect WP_Post sau obiect de comentariu.
 * @param array $args {
 *     Opțional. Argumente care să fie returnate în locul celor implicite.
 *
 *     @type int    $size           Înălțimea și lățimea avatarului în pixeli. Implicit 96.
 *     @type string $default        URL pentru imaginea implicită sau un tip implicit. Acceptă '404' (returnează
 *                                  o eroare 404 în loc de o imagine implicită), 'retro' (8bit), 'monsterid' (monstru),
 *                                  'wavatar' (față de desen animat), 'indenticon' (model "patchwork"), 'mystery', 'mm',
 *                                  sau 'mysterman' (Omul Stridie), 'blank' (GIF transparent), sau
 *                                  'gravatar_default' (sigla Gravatar). Implicit este valoarea opțiunii
 *                                  'avatar_default', cu o rezervă 'mystery'.
 *     @type bool   $force_default  Dacă să afișeze întotdeauna imaginea implicită, niciodată Gravatar. Implicit false.
 *     @type string $rating         Ce rating să afișeze avatarele. Acceptă 'G', 'PG', 'R', 'X', și sunt
 *                                  judecate în această ordine. Implicit este valoarea opțiunii 'avatar_rating'.
 *     @type string $scheme         Schema URL de utilizat. Vezi set_url_scheme() pentru valorile acceptate.
 *                                  Implicit null.
 *     @type array  $processed_args Când funcția returnează, valoarea va fi $args procesat/sanitizat
 *                                  plus o "presupunere" found_avatar. Trimite ca referință. Implicit null.
 * }
 * @return false|string URL-ul avatarului găsit sau false dacă nu s-a putut găsi un avatar.
 */
function get_avatar_url( $id_or_email, $args = null ) {
    $args = get_avatar_data( $id_or_email, $args );
    return $args['url'];
}

unde get_avatar_data() este de asemenea o nouă funcție ajutătoare.

Aceasta conține această porțiune de cod:

... TĂIAT ...

/**
 * Filtrează dacă să obțină URL-ul avatarului devreme.
 *
 * Transmiterea unei valori non-null în membru 'url' al array-ului returnat va
 * efectiv scurta circuitul get_avatar_data(), trecând valoarea prin
 * filtrul {@see 'get_avatar_data'} și returnând devreme.
 *
 * @since 4.2.0
 *
 * @param array             $args          Argumente transmise la get_avatar_data(), după procesare.
 * @param int|object|string $id_or_email   Un ID utilizator, adresă de email sau obiect de comentariu.
 */
$args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email );
if ( isset( $args['url'] ) && ! is_null( $args['url'] ) ) {
    /** Acest filtru este documentat în wp-includes/link-template.php */
    return apply_filters( 'get_avatar_data', $args, $id_or_email );
}

... TĂIAT ...

unde putem observa că atunci când parametrul url este setat, filtrele disponibile sunt pre_get_avatar_data și get_avatar_data.

După actualizarea la versiunea 4.2 recent, am avut o problemă cu o temă care definia propria versiune a funcției get_avatar_url(), fără niciun prefix la numele funcției sau o verificare function_exists(). Deci acesta este un exemplu de ce este important acest lucru ;-)

14 mai 2015 02:23:21
0

Poți folosi filtrul get_avatar pentru a obține toate datele avatarului, inclusiv URL-ul din marcaj. Cred că WP nu are o funcție care să returneze doar URL-ul imaginii avatarului.

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

De asemenea, poți rescrie această funcție într-un plugin sau temă, funcția este activă doar dacă numele acestei funcții nu este definit în altă parte.

if ( ! function_exists( 'get_avatar' ) ) :

Așadar, este posibil să adaugi un parametru pentru a returna doar URL-ul imaginii, astfel: folosește parametrul $url cu valoarea TRUE și vei obține doar URL-ul.

/**
 * Returnează avatarul pentru un utilizator care a furnizat un ID de utilizator sau o adresă de email.
 *
 * @since 2.5
 * @param int|string|object $id_or_email Un ID de utilizator, adresă de email sau obiect de comentariu
 * @param int $size Dimensiunea imaginii avatarului
 * @param string $default URL către o imagine implicită de utilizat dacă nu este disponibil un avatar
 * @param string $alt Text alternativ de utilizat în eticheta de imagine. Implicit este gol
 * @param boolean $url, true pentru a obține doar URL-ul imaginii, fără marcaj
 * @return string Eticheta <img> pentru avatarul utilizatorului
*/
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) ) {
        // Fără avatar pentru pingbacks sau 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);
}

O altă variantă simplă este să creezi URL-ul conform regulilor Gravatar.

function get_gravatar_url( $email ) {

    $hash = md5( strtolower( trim ( $email ) ) );
    return 'http://gravatar.com/avatar/' . $hash;
}

Folosește această funcție în codul tău cu adresele de email ale autorilor și vei obține URL-ul imaginii lor.

24 iul. 2012 11:31:26
0

Cred că aceasta este o versiune îmbunătățită a răspunsului lui aalaap:

// În template-ul tău ...
$avatar_url = get_avatar_url ( get_the_author_meta('ID'), $size = '50' ); 

// Obține URL-ul src din tag-ul <img> al avatarului (adaugă în 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');

Simple Local Avatars utilizează câmpuri meta pentru a stoca avatarul, astfel încât poți obține simplu valoarea/valorile apelând get_user_meta și accesând câmpul 'simple_local_avatar'. Vei primi înapoi un array de genul:

array
(
  [full] => 'http://...',
  [96] => 'http://...',
  [32] => 'http://...'
)
15 apr. 2015 23:13:40
0

Metoda lui alaap nu mai funcționează în WordPress 4.2

Am găsit o soluție. Iată-o și funcționează bine:

 function my_gravatar_url() { // Obține emailul utilizatorului
$user_email = get_the_author_meta( 'user_email' );
// Converteste emailul în hash md5 și setează dimensiunea imaginii la 80 px
$user_gravatar_url = 'http://www.gravatar.com/avatar/' . md5($user_email) . '?s=80';
echo $user_gravatar_url; } 

În șablon folosește doar:

<?php my_gravatar_url() ?>

Notă: trebuie folosită în interiorul unei bucle.

25 apr. 2015 06:57:39
0

Când avatarul a fost încărcat local, WordPress returnează tagul img cu atributul src între ghilimele duble, așa că am descoperit că acest model funcționează mai bine:

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

Acum câteva ore, mă întrebam și eu cum să fac asta. Dar, în curând am găsit soluția și am creat un plugin, te rog verifică dacă get_avatar_url($user_id, $size) funcționează și pentru tine sau nu. Mulțumesc.

Codul pluginului:

/*
Plugin Name: Get Avatar URL
Plugin URI: https://github.com/faizan1041/get-avatar-url
Description: get_avatar returnează imaginea, get_avatar_url va returna sursa imaginii.
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' );

Utilizare:

Apelarea funcției:

get_avatar_url( get_the_author_meta( 'user_email'), 150);

Folosirea shortcode-ului:

do_shortcode('[avatar_url email="' . get_the_author_meta( 'user_email') .'" size=150 ]' );
14 dec. 2014 21:41:40