Comment obtenir l'URL de l'avatar au lieu d'une balise HTML IMG lors de l'utilisation de get_avatar?


28

J'utilise un plugin appelé Simple Local Avatars qui me permet de télécharger des images d'auteur stockées sur mon serveur localement (pas de Gravatar). Le plugin fonctionne très bien et get_avatarrenvoie l'avatar local.

Cependant, je dois utiliser cet avatar de différentes manières et à différents endroits et pour cela, j'ai besoin de l'URL de l'image de l'avatar local au lieu de la balise HTML entière. Je pourrais écrire une fonction wrapper pour get_avatarqui utilise RegEx ou SimpleXML pour sélectionner et renvoyer uniquement l'URL, mais je me demandais s'il existe un moyen existant de le faire.

Réponses:


26

Bonne nouvelle pour les versions de WordPress 4.2+

Depuis la version 4.2, la get_avatar_url()fonction pratique , introduite en tant que demande de fonctionnalité dans le ticket # 21195 il y a quelques années, est désormais livrée avec le noyau :

/**
 * Retrieve the avatar URL.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email The Gravatar to retrieve a URL for. Accepts a user_id, gravatar md5 hash,
 *                           user email, WP_User object, WP_Post object, or comment object.
 * @param array $args {
 *     Optional. Arguments to return instead of the default arguments.
 *
 *     @type int    $size           Height and width of the avatar in pixels. Default 96.
 *     @type string $default        URL for the default image or a default type. Accepts '404' (return
 *                                  a 404 instead of a default image), 'retro' (8bit), 'monsterid' (monster),
 *                                  'wavatar' (cartoon face), 'indenticon' (the "quilt"), 'mystery', 'mm',
 *                                  or 'mysterman' (The Oyster Man), 'blank' (transparent GIF), or
 *                                  'gravatar_default' (the Gravatar logo). Default is the value of the
 *                                  'avatar_default' option, with a fallback of 'mystery'.
 *     @type bool   $force_default  Whether to always show the default image, never the Gravatar. Default false.
 *     @type string $rating         What rating to display avatars up to. Accepts 'G', 'PG', 'R', 'X', and are
 *                                  judged in that order. Default is the value of the 'avatar_rating' option.
 *     @type string $scheme         URL scheme to use. See set_url_scheme() for accepted values.
 *                                  Default null.
 *     @type array  $processed_args When the function returns, the value will be the processed/sanitized $args
 *                                  plus a "found_avatar" guess. Pass as a reference. Default null.
 * }
 * @return false|string The URL of the avatar we found, or false if we couldn't find an avatar.
 */
function get_avatar_url( $id_or_email, $args = null ) {
    $args = get_avatar_data( $id_or_email, $args );
    return $args['url'];
}

get_avatar_data()est également une nouvelle fonction d'aide.

Il contient cette partie de code:

... CUT ...

/**
 * Filter whether to retrieve the avatar URL early.
 *
 * Passing a non-null value in the 'url' member of the return array will
 * effectively short circuit get_avatar_data(), passing the value through
 * the {@see 'get_avatar_data'} filter and returning early.
 *
 * @since 4.2.0
 *
 * @param array             $args          Arguments passed to get_avatar_data(), after processing.
 * @param int|object|string $id_or_email   A user ID, email address, or comment object.
 */
$args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email );
if ( isset( $args['url'] ) && ! is_null( $args['url'] ) ) {
    /** This filter is documented in wp-includes/link-template.php */
    return apply_filters( 'get_avatar_data', $args, $id_or_email );
}

... CUT ...

où nous pouvons voir que lorsque le urlparamètre est défini, les filtres disponibles sont pre_get_avatar_dataet get_avatar_data.

Après une mise à niveau vers 4.2 récemment, j'ai eu un problème avec un thème qui définissait sa propre version de get_avatar_url(), sans aucun préfixe de nom de fonction ni function_exists()vérification. C'est donc un exemple de pourquoi c'est important ;-)


25

La réponse ci-dessus semble complète, mais je viens d'écrire une fonction wrapper et de passer à autre chose. Le voici si vous en avez besoin (mettez ceci functions.php):

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

puis utilisez-le où vous en avez besoin dans les fichiers de modèle comme ceci:

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

C'est juste plus simple.

Dans ce cas, l'utilisation de RegEx pour analyser du HTML est acceptable, car cela n'analysera qu'une seule imgbalise, ce ne sera donc pas trop coûteux.


5
Un petit changement ... la fonction get_avatar met le src entre "pas 'donc la correspondance sera nulle. Le regex devrait être preg_match (' / src =" (. *?) "/ I ', $ get_avatar, $ matches) ;
spdaly

merci @spdaly - j'espère que commenter ferait modifier l'auteur;) - merci aalaap
Sagive SEO

Si vous avez répondu à votre propre question, veuillez la marquer comme réponse acceptée.
DᴀʀᴛʜVᴀᴅᴇʀ

@ Dark_Vader Je n'y suis pas retourné depuis que j'ai posté la question, donc je ne sais plus si c'est la façon idéale de le faire. Je pense que la nouvelle réponse concernant 4.2+ est meilleure.
aalaap

6

Vous pouvez utiliser le filtre get_avatarpour obtenir toutes les données vers l'avatar, ainsi que l'URL à l'intérieur du balisage. Je pense que WP n'a pas de fonction pour renvoyer uniquement l'url si l'image de l'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);

Vous pouvez également réécrire cette fonction dans un plugin ou un thème, la fonction est uniquement active, si ce nom de fonction n'est pas défini à un autre endroit.

if ( ! function_exists( 'get_avatar' ) ) :

Il est donc possible d'ajouter un param pour ne renvoyer que l'url de l'image, comme ceci, utilisez le param $urlavec TRUEet vous n'obtiendrez que l'url.

/**
 * Retrieve the avatar for a user who provided a user ID or email address.
 *
 * @since 2.5
 * @param int|string|object $id_or_email A user ID,  email address, or comment object
 * @param int $size Size of the avatar image
 * @param string $default URL to a default image to use if no avatar is available
 * @param string $alt Alternate text to use in image tag. Defaults to blank
 * @param boolean $url, true for get only the url of the image, no markup
 * @return string <img> tag for the user's avatar
*/
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) ) {
        // No avatar for pingbacks or 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);
}

Une autre petite variante est que vous créez l'url avec la règle de Gravatar.

function get_gravatar_url( $email ) {

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

utilisez-le sur votre source avec les e-mails des auteurs et vous obtenez l'url de leur image.


2

Je pense que c'est une meilleure version de la réponse d'Aalaap:

// In your template ...
$avatar_url = get_avatar_url ( get_the_author_meta('ID'), $size = '50' ); 

// Get src URL from avatar <img> tag (add to 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] );
}

1
get_user_meta($userId, 'simple_local_avatar');

Les avatars locaux simples utilisent des méta-champs pour stocker l'avatar, vous pouvez donc simplement récupérer la ou les valeurs en appelant get_user_metaet en saisissant le champ «simple_local_avatar». Vous recevrez un tableau comme ceci:

array
(
  [full] => 'http://...',
  [96] => 'http://...',
  [32] => 'http://...'
)

1

La méthode d'Alaap ne fonctionne plus dans Wordpress 4.2

J'ai trouvé une solution. Le voici et ça marche bien:

 function my_gravatar_url() { // Get user email
$user_email = get_the_author_meta( 'user_email' );
// Convert email into md5 hash and set image size to 80 px
$user_gravatar_url = 'http://www.gravatar.com/avatar/' . md5($user_email) . '?s=80';
echo $user_gravatar_url; } 

dans le modèle, utilisez simplement:

<?php my_gravatar_url() ?>

Remarque: il doit être utilisé dans une boucle.


0

Lorsque l'avatar a été téléchargé localement, WP, renvoie la balise img avec l'attribut src entre guillemets, j'ai donc trouvé que ce modèle fonctionnait mieux:

preg_match("/src=['\"](.*?)['\"]/i", $get_avatar, $matches);

0

Il y a quelques heures, je me demandais comment faire cela aussi. Mais, bientôt, j'ai obtenu la solution et créé un plugin, veuillez vérifier si get_avatar_url ($ user_id, $ size) fonctionne pour vous ou non. Merci..

Code du plugin:

/*
Plugin Name: Get Avatar URL
Plugin URI: https://github.com/faizan1041/get-avatar-url
Description: get_avatar returns image, get_avatar_url will give you the image src.
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' );

Usage:

Appel de la fonction:

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

Utilisation de Shortcode:

do_shortcode('[avatar_url email="' . get_the_author_meta( 'user_email') .'" size=150 ]' );
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.