web-dev-qa-db-fra.com

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

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

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

28
aalaap

Bonne nouvelle pour les versions WordPress 4.2+

Depuis la version 4.2, la fonction pratique get_avatar_url(), introduite sous la forme d'une demande de fonctionnalité dans le ticket # 21195 il y a quelques années, est maintenant 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'assistance.

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 paramètre url est défini, les filtres disponibles sont pre_get_avatar_data et get_avatar_data.

Récemment, après la mise à niveau vers la version 4.2, un problème avec un thème définissant sa propre version de get_avatar_url(), sans aucun contrôle de préfixe du nom de fonction} ni de function_exists(). C'est donc un exemple de pourquoi c'est important ;-)

26
birgire

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

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

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

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

C'est juste plus simple.

Utiliser RegEx pour analyser HTML dans ce cas est correct, car il ne s'agira que d'analyser une balise img, de sorte que ce ne sera pas trop coûteux.

25
aalaap

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

Aussi, vous pouvez réécrire cette fonction dans un plugin ou un thème, la fonction est onyl active, si le nom de cette fonction n’est pas défini ailleurs.

if ( ! function_exists( 'get_avatar' ) ) :

Il est donc possible d’ajouter un paramètre pour ne renvoyer que l’url de l’image, comme ceci, utilisez le paramètre $url avec TRUE et vous n’obtenez 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('[email protected]')
    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 ceci sur votre source avec les emails des auteurs et vous obtenez l'URL de leur image.

6
bueltge

Je pense que ceci est une meilleure version de la réponse de 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] );
}
2
Justin
get_user_meta($userId, 'simple_local_avatar');

Simple Local Avatars utilise des méta-champs pour stocker l'avatar. Vous pouvez donc simplement récupérer les valeurs en appelant get_user_meta et en récupérant le champ 'simple_local_avatar'. Vous obtiendrez un tableau comme ceci:

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

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

Je suis venu avec une solution. La 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, il suffit d'utiliser:

<?php my_gravatar_url() ?>

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

1
Devi

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

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

Il y a quelques heures, je me demandais comment faire cela aussi. Mais, bientôt, j'ai eu 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' );

Utilisation:

Appeler la fonction:

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

Utiliser Shortcode:

do_shortcode('[avatar_url email="' . get_the_author_meta( 'user_email') .'" size=150 ]' );
0
Faizan Ali