Jag använder ett plugin som heter Enkla lokala avatarer som låter mig ladda upp författarbilder som lagras på min server lokalt (ingen Gravatar). Plugin fungerar bra och get_avatar
returnerar den lokala avataren.
Jag måste dock använda den avataren i olika sätt och olika platser och för det behöver jag den lokala avatarbildens URL i stället för hela HTML-taggen. Jag skulle kunna skriva en omslagsfunktion för get_avatar
som använder RegEx eller SimpleXML för att plocka ut och returnera bara webbadressen, men jag undrade om det finns något existerande sätt att göra detta.
Svar
Goda nyheter för WordPress-versioner 4.2+
Sedan version 4.2 den praktiska get_avatar_url()
-funktionen, introducerad som en funktionsbegäran i biljetten # 21195 för några år sedan, levereras nu med kärnan :
/** * 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"]; }
där
get_avatar_data()
är också en ny hjälpfunktion.
Den innehåller den här koddelen:
... 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 ...
där vi kan se att när url
-parametern är inställd är de tillgängliga filtren pre_get_avatar_data
och get_avatar_data
.
Efter uppgradering till 4.2 nyligen hade jag ett problem med ett tema som definierade sin egen version av get_avatar_url()
, utan något funktionsnamnprefix eller en function_exists()
-kontroll. Så detta är ett exempel på varför det är viktigt 😉
Svar
Svaret ovan verkar omfattande, men jag bara skrev en inslagningsfunktion och gick vidare. Här är det om du behöver det (lägg det i functions.php
):
function get_avatar_url($get_avatar){ preg_match("/src="(.*?)"/i", $get_avatar, $matches); return $matches[1]; }
och använd sedan den där du behöver den i mallfilerna så här:
<img src="<? echo get_avatar_url(get_avatar( $curauth->ID, 150 )); ?>" align="left" class="authorimage" />
Det är bara enklare.
Använda RegEx för att analysera HTML i det här fallet är okej, eftersom det här bara kommer att analysera en img
-tagg, så det blir inte för dyrt.
Kommentarer
- En liten förändring … get_avatar-funktionen placerar src inom ” inte ’ så matchningen blir noll. Regex bör vara preg_match (’ / src = ” (. *?) ” / i ’, $ get_avatar, $ matches);
- tack @spdaly – jag hoppas att kommentarer skulle göra det e författare att redigera;) – tack aalaap
- Om du har svarat på din egen fråga, markera den som det accepterade svaret.
- @Darth_Vader Jag har inte ’ t har gått tillbaka till detta sedan jag lade upp frågan, så jag ’ är inte längre säker på om det här är det perfekta sättet att göra det. Jag tycker att det nya svaret om 4.2+ är bättre.
Svar
Du kan använda filtret get_avatar
för att få all data till avataren, även webbadressen inuti markeringen. Jag tror att WP inte har en funktion för att bara returnera url om avatarbilden.
$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 också skriva om den här funktionen i ett plugin eller tema , är funktionen onyl aktiv, om detta funktionsnamn inte finns på någon annan plats definierad.
if ( ! function_exists( "get_avatar" ) ) :
Så det är möjligt att lägga till en parametern för att endast returnera webbadressen till bilden, så här, använd param $url
med TRUE
och du får bara webbadressen.
/** * 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 annan liten variant är att du skapa url med Gravatar-regeln.
function get_gravatar_url( $email ) { $hash = md5( strtolower( trim ( $email ) ) ); return "http://gravatar.com/avatar/" . $hash; }
använd detta på din källa med författarnas e-postmeddelanden och du får webbadressen till bilden.
Svar
Jag tycker att det här är en bättre version av 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");
Enkel Lokala avatarer använder metafält för att lagra avataren, så du kan helt enkelt hämta värdet genom att ringa get_user_meta
och tar tag i fältet ”simple_local_avatar”. Du kommer att returnera en matris som sådan:
array ( [full] => "http://...", [96] => "http://...", [32] => "http://..." )
Svar
alaaps metod fungerar inte längre i WordPress 4.2
Jag kom med en lösning. Här är det och det fungerar bra:
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 mallen använder du bara:
<?php my_gravatar_url() ?>
Obs: den måste användas i en slinga.
Svar
När avataren har laddats upp lokalt, WP, returnerar img-taggen med attributet src i dubbla citat, så Jag tyckte att det här mönstret fungerade bättre:
preg_match("/src=["\"](.*?)["\"]/i", $get_avatar, $matches);
Svar
För några timmar sedan , Jag undrade hur man gör det också. Men snart fick jag lösningen och skapade ett plugin, kontrollera om get_avatar_url ($ user_id, $ size) fungerar för dig eller inte. Tack ..
Plugin-kod:
/* 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" );
Användning:
Ringer funktionen:
get_avatar_url( get_the_author_meta( "user_email"), 150);
Med hjälp av kortkod:
do_shortcode("[avatar_url email="" . get_the_author_meta( "user_email") ."" size=150 ]" );