[Wordpress] question sur la fonction get_avatar(). Oui, c'est très spécifique ://

Répondre
Partager Rechercher
Salut.
Alors voilà : sur mon WP j'ai des utilisateurs avec des gravatars, et d'autres avec des avatars stockés localement sur mon WP (dans /upoads/…), dont les adresses email ne sont pas associées à des gravatars.

get_avatar() retourne un tag <img> avec un attribut src qui mène vers le bon avatar : si l'utilisateur a un gravatar src mène vers une url gravatar, si l'utilisateur a un avatar local, l'attribut src mène vers l'adresse locale.
C'est super !

get_avatar_url() lui en revanche retourne systématiquement une adresse gravatar. Même pour les utilisateurs qui ont un avatar local : ça retourne une adresse gravatar qui affiche une icône de profil gravatar par défaut :
635519591012084736.png.

Alors j'ai regardé dans la fonction get_avatar(), notamment ce passage :
Code PHP:

$avatar sprintf(
    
"<img alt='%s' src='%s' srcset='%s' class='%s' height='%d' width='%d' %s/>",
    
esc_attr$args['alt'] ),
    
esc_url$url ),
    
esc_attr"$url2x 2x" ),
    
esc_attrjoin' '$class ) ),
    (int) 
$args['height'],
    (int) 
$args['width'],
    
$args['extra_attr']
);

return 
apply_filters'get_avatar'$avatar$id_or_email$args['size'], $args['default'], $args['alt'], $args ); 
Si je fais un echo sur $url, j'obtiens TOUJOURS une url gravatar.
Mais le apply_filters semble être magique puisque grâce à ça la fonction retourne une image avec la bonne url, gravatar OU local.

Et donc je comprends rien. Pourquoi ? Comment ?

Et surtout : comment est-ce que je peux simplement demander à WP de me retourner l'avatar d'un utilisateur, qu'il soit local ou gravatar? C'est quasiment ce que fait get_avatar(), à ceci près qu'il me retourne un tag image et non pas une url. Et qu'à aucun moment dans la fonction je n'ai trouvé d'url locale à coups de var_dump.

Si quelqu'un a une idée, je suis très preneur.
__________________
https://jolstatic.fr/forums/signaturepics/sigpic2399_3.gif
Je dirais que ton $args doit forcément contenir l'info sur ton avatar local et distant.

Et il semble récupérer cette info de get_avatar_data()
De base il n'y a aucune fonction attachée au filtre "get_avatar", donc tu dois avoir un plugin qui en ajoute une et qui va faire le taff.

Cherche pour un " add_filter( 'get_avatar' " avec les différentes variantes avec espaces/quote/simple quote dans ton dossier /plugins puis la fonction associée. Ça te donnera une idée de comment ça se gère.

Sinon le plus simple est de garder la fonction "get_avatar()" est d'extraire l'URL de ton tag IMG via un preg_match()
Haha j'ai pensé au fait qu'un plugin ou un thème ajoutait un filtre quelque part et puis j'ai oublié.
Il s'agissait de buddypress, merci pour vos réponses, vous êtes meilleur que stackoverflow et discord réunis.

La solution d'extraire l'url de mon tag img m'intéresse mais je ne vois pas comment l'appliquer, tu peux m'en dire plus ?

edit : y a une fonction native de buddypress permettant de retourner l'url d'un avatar (d'ailleurs c'est genre de ce côté que y a un filtre) :

Suffit d'exécuter
Code:
bp_core_fetch_avatar ( array
(  'item_id' => get_the_author_meta('ID'), 'html'   => FALSE )
);
Et hop
(html à true retourne un tag <img>)

Mais ton truc avec preg match m'intéresse. Le truc chiant là c'est que get_avatar() dès que tu l'exécutes, il affiche l'image en html, donc je vois pas comment le modifier avant.

re edit : en fait, le meilleur truc à faire serait de créer un filter sur get_avatar pour remplacer le <img> par un <div> (et faire sauter pas mal d'attributs au passage), mais j'y arrive pô.

J'ai tenté ça en ajoutant un <hr> (pour voir si ça marche) :
Code:
add_filter( 'get_avatar' , 'my_custom_avatar' , 11 , 6 );
function my_custom_avatar( $avatar, $id_or_email, $size, $default, $alt, $args ) {
    $avatar = "<hr><img alt='{$alt}' src='/{$args['url']}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
    return $avatar;
}
En fonction de la priorité soit ça marche et ça fout un avatar gravatar (autrement dit, ça passe pas par le filtre de buddypress), soit ça ne fait rien du tout. :/

Dernière modification par Coin-coin le Canapin ; 09/03/2017 à 22h21.
Ben en fait, dès qu'on écrit get_avatar() dans une page, ça affiche un tag image, puisque get_avatar retourne un sprintf.
Donc je vois pas comment je peux extraire une info sans afficher le tag.

En plus utiliser direct get_avatar() va pas être le plus pratique pour moi puisqu'en réalité cette fonction est appelée à l'intérieur de :
Code:
bbp_reply_author_link( array( 'type' => 'avatar', 'size' => 50 ) )
C'est pour cela qu'il faudrait que j'arrive à filtrer get_avatar pour remplacer le <img> par un <div> et mettre l'url en background-image.

Mais j'y arrive pas : soit get_avatar est filtré par mon propre filtre mais pas celui de bbpress, soit l'inverse (en fonction de la priorité de mon filtre). :/
Ca ressemblerait à un truc comme ça

Code:
<?php
$avatar = get_avatar($author_id);
preg_match("/src='(.*?)'/i", $avatar, $matches);
?>

<div style="background-image: url(<?php echo $matches[1]; ?>);">
.....
.....
.....
</div>
En gros,

1) Tu récupères ton <img> normalement via get_avatar()
2) Tu utilises un preg_match() pour ne récupérer que l'URL dans le SRC
3) Tu ECHO l'URL dans une DIV

Bon tu auras sans doute du CSS à ajouter sur ta DIV, mais c'est une autre question.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés