Cum obțin URL-ul avatarului în loc de un tag HTML IMG când folosesc get_avatar?
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.
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.

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

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

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

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

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&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);
}
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.

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

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://...'
)

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.

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