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

28

Estoy usando un complemento llamado Avatares locales simples que me permite cargar imágenes de autor que se almacenan en mi servidor localmente (no Gravatar). El complemento funciona bien y get_avatardevuelve 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 la etiqueta HTML completa. Podría escribir una función de contenedor para get_avatarque use RegEx o SimpleXML para seleccionar y devolver solo la URL, pero me preguntaba si existe alguna forma de hacerlo.

aalaap
fuente

Respuestas:

26

Buenas noticias para WordPress versiones 4.2+

Desde la versión 4.2, la práctica get_avatar_url()función, introducida como una solicitud de función en el boleto n . ° 21195 hace unos años, ahora se envía 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 hay una nueva función auxiliar.

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 urlse establece el parámetro, los filtros disponibles son pre_get_avatar_datay get_avatar_data.

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

Birgire
fuente
25

La respuesta anterior parece exhaustiva, pero acabo de escribir una función de contenedor y seguí adelante. Aquí está si lo necesitas (pon esto functions.php):

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

y luego úselo 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 mas simple.

Usar RegEx para analizar HTML en este caso está bien, porque solo analizará una imgetiqueta, por lo que no será demasiado costoso.

aalaap
fuente
55
Un pequeño cambio ... la función get_avatar coloca el src dentro de "not 'para que la coincidencia sea nula. La expresión regular debe ser preg_match (' / src =" (. *?) "/ I ', $ get_avatar, $ coincidencias) ;
spdaly
gracias @spdaly - espero que los comentarios hagan que el autor edite;) - gracias aalaap
Sagive SEO
Si respondió su propia pregunta, márquela como la respuesta aceptada.
DᴀʀᴛʜVᴀᴅᴇʀ
@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 4.2+ es mejor.
aalaap
6

Puede usar el filtro get_avatarpara llevar todos los datos al 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 complemento o tema, la función está activa en onyl, 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 $urlcon TRUEy 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.

bueltge
fuente
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] );
}
Justin
fuente
1
get_user_meta($userId, 'simple_local_avatar');

Avatares locales simples utiliza metacampos para almacenar el avatar, por lo que simplemente puede recuperar los valores llamando get_user_metay tomando el campo 'simple_local_avatar'. Obtendrá una matriz como esta:

array
(
  [full] => 'http://...',
  [96] => 'http://...',
  [32] => 'http://...'
)
Jon
fuente
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 Plantilla solo usa:

<?php my_gravatar_url() ?>

Aviso: debe usarse dentro de un bucle.

Devi
fuente
0

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

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

Hace unas horas, me preguntaba cómo hacer eso también. Pero, pronto obtuve la solución e hice un complemento, compruebe si get_avatar_url ($ user_id, $ size) funciona para usted 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);

Usando Shortcode:

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