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

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

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

Responder

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 función en ticket # 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 es 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 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 ningún prefijo de nombre de función o una marca de function_exists(). Así que este es un ejemplo de por qué eso es importante 😉

Respuesta

La respuesta anterior parece completa, pero simplemente escribió una función contenedora y siguió adelante. Aquí está si la necesita (ponga esto en 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 más simple.

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

Comentarios

  • Un pequeño cambio … la función get_avatar coloca el src dentro de » no ‘ por lo que la coincidencia será nula. La expresión regular debe ser preg_match (‘ / src = » (. *?) » / i ‘, $ get_avatar, $ matches);
  • gracias @spdaly. Espero que comentar lo haga e autor para editar;) – gracias aalaap
  • Si respondió a su propia pregunta, márquela como la respuesta aceptada.
  • @Darth_Vader No tengo ‘ t volví 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.

Answer

Puedes usar el filtro get_avatar para obtener todos los datos del 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 puedes reescribir esta función dentro de un complemento o tema , la función solo está activa, si el nombre de esta función no está en otro lugar definido.

if ( ! function_exists( "get_avatar" ) ) : 

Entonces es posible agregar un parámetro para devolver solo la url de la imagen, así, use el parámetro $url con TRUE y obtienes 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 crea la URL con la regla de Gravatar.

function get_gravatar_url( $email ) { $hash = md5( strtolower( trim ( $email ) ) ); return "http://gravatar.com/avatar/" . $hash; } 

usa esto en tu fuente con los correos electrónicos de los autores y obtendrás la URL de la imagen.

Respuesta

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] ); } 

Respuesta

get_user_meta($userId, "simple_local_avatar"); 

Simple Los avatares locales usan metacampos para almacenar el avatar, por lo que puede recuperar los valores simplemente llamando a get_user_meta y tomando el campo «simple_local_avatar». Obtendrá una matriz como esta:

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

Respuesta

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 use:

<?php my_gravatar_url() ?> 

Aviso: debe usarse dentro de un bucle.

Responder

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 funcionaba mejor:

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

Respuesta

Hace unas horas , Yo también me preguntaba cómo hacer eso. Pero, pronto obtuve la solución e hice un complemento, verifique si get_avatar_url ($ user_id, $ size) funciona para usted o no. Gracias ..

Código del 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 ]" ); 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *