Jeg bruger et plugin kaldet Simple Local Avatars , som lader mig uploade forfatterbilleder som er gemt på min server lokalt (ingen Gravatar). Pluginet fungerer fint, og get_avatar
returnerer den lokale avatar.
Jeg skal dog bruge den avatar i forskellige måder og forskellige steder, og til det har jeg brug for den lokale avatar-billed-URL i stedet for hele HTML-tagget. Jeg kunne skrive en indpakningsfunktion til get_avatar
, der bruger RegEx eller SimpleXML til at vælge og returner kun URLen, men jeg spekulerede på, om der er nogen eksisterende måde at gøre dette på.
Svar
Gode nyheder til WordPress-versioner 4.2+
Siden version 4.2 er den praktiske get_avatar_url()
-funktion, introduceret som en funktionsanmodning i billet # 21195 for få år siden sendes nu med kernen :
/** * 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"]; }
hvor
get_avatar_data()
er også en ny hjælperfunktion.
Den indeholder denne kodedel:
... 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 ...
hvor vi kan se, at når url
-parameteren er indstillet, er de tilgængelige filtre pre_get_avatar_data
og get_avatar_data
.
Efter for nylig at have opgraderet til 4.2 havde jeg et problem med et tema, der definerede sin egen version af get_avatar_url()
uden nogen funktionsnavnspræfiks eller en function_exists()
-kontrol. Så dette er et eksempel på, hvorfor det er vigtigt 😉
Svar
Svaret ovenfor virker omfattende, men jeg bare skrev en indpakningsfunktion og gik videre. Her er det, hvis du har brug for det (sæt dette i functions.php
):
function get_avatar_url($get_avatar){ preg_match("/src="(.*?)"/i", $get_avatar, $matches); return $matches[1]; }
og brug den derefter, når du har brug for den i skabelonfilerne som denne:
<img src="<? echo get_avatar_url(get_avatar( $curauth->ID, 150 )); ?>" align="left" class="authorimage" />
Det er bare enklere.
Brug RegEx til at analysere HTML i dette tilfælde er okay, fordi dette kun parser et img
-tag, så det bliver ikke for dyrt.
Kommentarer
- En lille ændring … get_avatar-funktionen placerer src inden for ” ikke ‘ så kampen vil være nul. Regexen skal være preg_match (‘ / src = ” (. *?) ” / i ‘, $ get_avatar, $ matches);
- tak @spdaly – jeg håber at kommentere ville gøre det e forfatter til redigering;) – tak aalaap
- Hvis du besvarede dit eget spørgsmål, bedes du markere det som det accepterede svar.
- @Darth_Vader Jeg har ikke ‘ t gået tilbage til dette, siden jeg sendte spørgsmålet, så jeg ‘ er ikke længere sikker på, om dette er den ideelle måde at gøre det på. Jeg synes, det nye svar om 4.2+ er bedre.
Svar
Du kan bruge filteret get_avatar
for at få alle data til avataren, også url inde i markeringen. Jeg tror, WP har ikke en funktion til kun at returnere urlen, hvis avatarbilledet.
$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);
Du kan også omskrive denne funktion inde i et plugin eller tema , er funktionen onyl aktiv, hvis dette funktionsnavn ikke er et andet sted defineret.
if ( ! function_exists( "get_avatar" ) ) :
Så det er muligt at tilføje en parameter for kun at returnere billedets url, som denne, brug param $url
med TRUE
og du får kun 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&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 .= "&d=" . urlencode( $default ); $rating = get_option("avatar_rating"); if ( !empty( $rating ) ) $out .= "&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); }
En anden lille variant er, at du Opret url med reglen om Gravatar.
function get_gravatar_url( $email ) { $hash = md5( strtolower( trim ( $email ) ) ); return "http://gravatar.com/avatar/" . $hash; }
brug dette på din kilde med e-mails fra forfattere, og du får url til det billede.
Svar
Jeg synes, det er en bedre version af aalaaps svar:
// 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] ); }
Svar
get_user_meta($userId, "simple_local_avatar");
Simple Lokale avatarer bruger metafelter til at gemme avataren, så du kan simpelthen hente værdien / værdierne ved at ringe til get_user_meta
og tager fat i “simple_local_avatar” -feltet. Du får returneret en matrix som sådan:
array ( [full] => "http://...", [96] => "http://...", [32] => "http://..." )
Svar
alaaps metode fungerer ikke længere i WordPress 4.2
Jeg kom på en løsning. Her er det, og det fungerer godt:
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; }
i skabelonen skal du bare bruge:
<?php my_gravatar_url() ?>
Bemærk: det skal bruges i en løkke.
Svar
Når avataren er uploadet lokalt, WP, returnerer img-tagget med attributten src i dobbelt anførselstegn, så Jeg fandt dette mønster fungeret bedre:
preg_match("/src=["\"](.*?)["\"]/i", $get_avatar, $matches);
Svar
For et par timer siden , Jeg spekulerede på, hvordan jeg også kunne gøre det. Men snart fik jeg løsningen og lavede et plugin. Kontroller venligst om get_avatar_url ($ user_id, $ size) fungerer for dig eller ej. Tak ..
Pluginkode:
/* 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" );
Brug:
Opkald til funktionen:
get_avatar_url( get_the_author_meta( "user_email"), 150);
Brug af Shortcode:
do_shortcode("[avatar_url email="" . get_the_author_meta( "user_email") ."" size=150 ]" );