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

24 jul 2012, 11:05:13
Vistas: 54.9K
Votos: 28

Estoy usando un plugin llamado Simple Local Avatars que me permite subir imágenes de autor que se almacenan localmente en mi servidor (sin Gravatar). El plugin funciona bien y get_avatar devuelve el avatar local.

Sin embargo, necesito usar ese avatar de diferentes maneras y en diferentes lugares, y para eso necesito la URL de la imagen del avatar local en lugar de toda la etiqueta HTML. Podría escribir una función envolvente para get_avatar que use RegEx o SimpleXML para extraer y devolver solo la URL, pero me preguntaba si existe alguna manera existente de hacer esto.

0
Todas las respuestas a la pregunta 8
4
25

La respuesta anterior parece exhaustiva, pero yo simplemente escribí una función envoltorio y seguí adelante. Aquí está por si la necesitas (coloca esto en functions.php):

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

y luego utilízala donde la necesites en los archivos de plantilla así:

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

Es más simple.

Usar expresiones regulares (RegEx) para analizar HTML en este caso está bien, porque solo analizará una etiqueta img, por lo que no será demasiado costoso.

25 jul 2012 14:35:04
Comentarios

Un pequeño cambio... la función get_avatar coloca el src dentro de comillas " y no ' por lo que la coincidencia será nula. La expresión regular debería ser preg_match('/src="(.*?)"/i', $get_avatar, $matches);

spdaly spdaly
17 sept 2014 15:43:10

gracias @spdaly - espero que comentar haga que el autor edite ;) - gracias aalaap

Sagive Sagive
21 dic 2014 05:04:47

Si respondiste tu propia pregunta, por favor márcala como la respuesta aceptada.

user9447 user9447
1 ago 2016 20:20:53

@Darth_Vader No he vuelto a esto desde que publiqué la pregunta, así que ya no estoy seguro de si esta es la forma ideal de hacerlo. Creo que la nueva respuesta sobre la versión 4.2+ es mejor.

aalaap aalaap
2 ago 2016 07:02:15
0
25

Buenas noticias para versiones de WordPress 4.2+

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

/**
 * Recupera la URL del avatar.
 *
 * @since 4.2.0
 *
 * @param mixed $id_or_email El Gravatar para recuperar una URL. Acepta un user_id, hash md5 de gravatar,
 *                           email de usuario, objeto WP_User, objeto WP_Post u objeto de comentario.
 * @param array $args {
 *     Opcional. Argumentos para devolver en lugar de los argumentos por defecto.
 *
 *     @type int    $size           Altura y ancho del avatar en píxeles. Por defecto 96.
 *     @type string $default        URL para la imagen por defecto o un tipo por defecto. Acepta '404' (devuelve
 *                                  un 404 en lugar de una imagen por defecto), 'retro' (8bits), 'monsterid' (monstruo),
 *                                  'wavatar' (cara de dibujos animados), 'indenticon' (el "quilt"), 'mystery', 'mm',
 *                                  o 'mysterman' (The Oyster Man), 'blank' (GIF transparente), o
 *                                  'gravatar_default' (el logo de Gravatar). Por defecto es el valor de la
 *                                  opción 'avatar_default', con un respaldo de 'mystery'.
 *     @type bool   $force_default  Si mostrar siempre la imagen por defecto, nunca el Gravatar. Por defecto false.
 *     @type string $rating         Qué rating mostrar para los avatares. Acepta 'G', 'PG', 'R', 'X', y son
 *                                  juzgados en ese orden. Por defecto es el valor de la opción 'avatar_rating'.
 *     @type string $scheme         Esquema de URL a usar. Ver set_url_scheme() para valores aceptados.
 *                                  Por defecto null.
 *     @type array  $processed_args Cuando la función devuelve, el valor será los $args procesados/saneados
 *                                  más un "found_avatar" guess. Pasar como referencia. Por defecto null.
 * }
 * @return false|string La URL del avatar encontrado, o false si no se pudo encontrar un 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 una nueva función auxiliar.

Contiene esta parte de código:

... CORTADO ...

/**
 * Filtra si se recupera la URL del avatar tempranamente.
 *
 * Pasar un valor no nulo en el miembro 'url' del array devuelto
 * efectivamente cortocircuitará get_avatar_data(), pasando el valor a través
 * del filtro {@see 'get_avatar_data'} y devolviendo tempranamente.
 *
 * @since 4.2.0
 *
 * @param array             $args          Argumentos pasados a get_avatar_data(), después de procesar.
 * @param int|object|string $id_or_email   Un ID de usuario, dirección de email u objeto de comentario.
 */
$args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email );
if ( isset( $args['url'] ) && ! is_null( $args['url'] ) ) {
    /** Este filtro está documentado en wp-includes/link-template.php */
    return apply_filters( 'get_avatar_data', $args, $id_or_email );
}

... CORTADO ...

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

Después de actualizar a la versión 4.2 recientemente, tuve un problema con un tema que definía su propia versión de get_avatar_url(), sin ningún prefijo de nombre de función o una comprobación function_exists(). Así que este es un ejemplo de por qué eso es importante ;-)

14 may 2015 02:23:21
0

Puedes usar el filtro get_avatar para obtener todos los datos del avatar, incluyendo la URL dentro del marcado. Creo que WordPress no tiene una función para devolver solo la URL de 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 puedes reescribir esta función dentro de un plugin o tema, la función solo está activa si este nombre de función no está definido en otro lugar.

if ( ! function_exists( 'get_avatar' ) ) :

Así que es posible añadir un parámetro para devolver solo la URL de la imagen, como este, usa el parámetro $url con TRUE y obtendrás solo la URL.

/**
 * Recupera el avatar de un usuario que proporcionó un ID de usuario o dirección de correo electrónico.
 *
 * @since 2.5
 * @param int|string|object $id_or_email Un ID de usuario, dirección de correo o objeto de comentario
 * @param int $size Tamaño de la imagen del avatar
 * @param string $default URL de una imagen por defecto si no hay avatar disponible
 * @param string $alt Texto alternativo para usar en la etiqueta de imagen. Por defecto vacío
 * @param boolean $url, true para obtener solo la URL de la imagen, sin marcado
 * @return string Etiqueta <img> para el avatar del usuario
*/
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 hay avatar para pingbacks o 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);
}

Otra pequeña variante es que crees la URL con las reglas de Gravatar.

function get_gravatar_url( $email ) {

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

Usa esto en tu código con los correos de los autores y obtendrás la URL de su imagen.

24 jul 2012 11:31:26
0

Creo que esta es una versión mejorada de la respuesta de aalaap:

// En tu plantilla ...
$avatar_url = get_avatar_url ( get_the_author_meta('ID'), $size = '50' ); 

// Obtener URL src de la etiqueta <img> del avatar (agregar a 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] );
}
25 mar 2014 21:36:52
0
get_user_meta($userId, 'simple_local_avatar');

Simple Local Avatars utiliza campos meta para almacenar el avatar, por lo que puedes simplemente obtener los valores llamando a get_user_meta y accediendo al campo 'simple_local_avatar'. Obtendrás un array como este:

array
(
  [full] => 'http://...',
  [96] => 'http://...',
  [32] => 'http://...'
)
15 abr 2015 23:13:40
0

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

Encontré una solución. Aquí está y funciona correctamente:

 function my_gravatar_url() { // Obtener el email del usuario
$user_email = get_the_author_meta( 'user_email' );
// Convertir el email en hash md5 y establecer tamaño de imagen a 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() ?>

Nota: debe usarse dentro de un bucle.

25 abr 2015 06:57:39
0

Cuando el avatar se ha subido localmente, WP devuelve la etiqueta img con el atributo src entre comillas dobles, así que encontré que este patrón funciona mejor:

preg_match("/src=['\"](.*?)['\"]/i", $get_avatar, $matches);
27 nov 2014 08:37:01
0

Hace unas horas, también me preguntaba cómo hacer eso. Pero, pronto encontré la solución y creé un plugin, por favor comprueba si get_avatar_url($user_id, $size) funciona para ti o no. Gracias.

Código del plugin:

/*
Plugin Name: Get Avatar URL
Plugin URI: https://github.com/faizan1041/get-avatar-url
Description: get_avatar devuelve una imagen, get_avatar_url te dará la src de la imagen.
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);

Usando el shortcode:

do_shortcode('[avatar_url email="' . get_the_author_meta( 'user_email') .'" size=150 ]' );
14 dic 2014 21:41:40