¿Cómo obtengo la URL del avatar en lugar de una etiqueta IMG HTML al usar get_avatar?

27

Estoy usando un complemento llamado Avatares locales simples que me permite subir imágenes de autor que se almacenan en mi servidor localmente (no Gravatar). El complemento funciona bien y get_avatar devuelve el avatar local.

Sin embargo, necesito usar ese avatar de diferentes maneras y diferentes lugares y para eso necesito la URL de la imagen del avatar local en lugar de la etiqueta HTML completa. Podría escribir una función de envoltorio para get_avatar que usa RegEx o SimpleXML para seleccionar y devolver solo la URL, pero me preguntaba si existe alguna forma de hacerlo.

    
pregunta aalaap 24.07.2012 - 10:05

8 respuestas

26

Buenas noticias para las versiones de WordPress 4.2+

Desde la versión 4.2, la práctica función get_avatar_url() , introducida como solicitud de función en el ticket # 21195 hace algunos años, ahora viene con el núcleo :

/**
 * 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'];
}

donde get_avatar_data() también es un Nueva función de ayuda.

Contiene esta parte del código:

... 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 ...

donde podemos ver que cuando se establece el parámetro url , los filtros disponibles son pre_get_avatar_data y get_avatar_data .

Después de actualizar a 4.2 recientemente, tuve un problema con un tema que definía su propia versión de get_avatar_url() , sin el prefijo de nombre de función o un function_exists() . Este es un ejemplo de por qué es importante ;-)

    
respondido por el birgire 14.05.2015 - 01:23
25

La respuesta anterior parece completa, pero acabo de escribir una función de envoltorio y seguir adelante. Aquí está si lo necesita (ponga esto en functions.php ):

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

y luego utilícelo donde lo necesite en los archivos de plantilla como este:

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

Es más simple.

El uso de RegEx para analizar HTML en este caso está bien, porque solo se analizará una etiqueta img , por lo que no será muy costoso.     

respondido por el aalaap 25.07.2012 - 13:35
6

Puede usar el filtro get_avatar para obtener todos los datos para el avatar, también la URL dentro del marcado. Creo que WP no tiene una función para devolver solo la URL si la imagen del 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);

También puede reescribir esta función dentro de un plugin o tema, la función está solo activa, si el nombre de esta función no está en otro lugar definido.

if ( ! function_exists( 'get_avatar' ) ) :

Por lo tanto, es posible agregar un parámetro para devolver solo la url de la imagen, así, use el parámetro $url con TRUE y obtendrá solo la 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);
}

Otra pequeña variante es que creas la url con la regla de Gravatar.

function get_gravatar_url( $email ) {

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

use esto en su fuente con los correos electrónicos de los autores y obtendrá la url de la imagen.

    
respondido por el bueltge 24.07.2012 - 10:31
2

Creo que esta es una mejor versión de la respuesta 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] );
}
    
respondido por el Justin 25.03.2014 - 20:36
1
get_user_meta($userId, 'simple_local_avatar');

Avatares locales simples utiliza campos de metadatos para almacenar el avatar, por lo que simplemente puede recuperar el valor (s) ) llamando a get_user_meta y tomando el campo 'simple_local_avatar'. Obtendrás una matriz como esta:

array
(
  [full] => 'http://...',
  [96] => 'http://...',
  [32] => 'http://...'
)
    
respondido por el Jon 15.04.2015 - 22:13
1

El método de alaap ya no funciona en Wordpress 4.2

Se me ocurrió una solución. Aquí está y está funcionando 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; } 

en la plantilla solo usa:

<?php my_gravatar_url() ?>

Aviso: debe usarse dentro de un bucle.

    
respondido por el Devi 25.04.2015 - 05:57
0

Cuando el avatar se ha cargado localmente, WP, devuelve la etiqueta img con el atributo src entre comillas dobles, por lo que encontré que este patrón funcionó mejor:

preg_match("/src=['\"](.*?)['\"]/i", $get_avatar, $matches);
    
respondido por el Nik Dow 27.11.2014 - 07:37
0

Hace unas horas, me preguntaba cómo hacerlo también. Pero, pronto obtuve la solución e hice un complemento, compruebe si get_avatar_url ($ user_id, $ size) Trabaja para ti o no. Gracias ..

Código de complemento:

/*
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' );

Uso :

Llamando a la función:

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

Utilizando Shortcode:

do_shortcode('[avatar_url email="' . get_the_author_meta( 'user_email') .'" size=150 ]' );
    
respondido por el Faizan Ali 14.12.2014 - 20:41

Lea otras preguntas en las etiquetas