get_avatar
返回本地化身。但是,我需要以不同的方式在不同的地方使用该化身,为此,我需要本地化身图像URL而不是整个HTML标签。我可以为get_avatar
编写一个包装函数,该包装函数使用RegEx或SimpleXML来挑选并仅返回URL,但是我想知道是否存在任何现有方法。#1 楼
WordPress 4.2以上版本的好消息自从版本4.2开始,便捷的
get_avatar_url()
函数作为几年前在票证#21195中的一项功能请求而引入,现在带有以下内核:/**
* 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'];
}
其中
get_avatar_data()
也是一个新的辅助函数。它包含以下代码部分:
... 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 ...
其中我们可以看到设置了
url
参数后,可用的过滤器是pre_get_avatar_data
和get_avatar_data
。最近升级到4.2之后,我遇到了一个主题,该主题定义了它自己的
get_avatar_url()
版本,没有任何问题函数名称前缀或function_exists()
检查。因此,这就是为什么如此重要的一个例子;-) #2 楼
上面的答案似乎很全面,但是我只是编写了一个包装函数并继续前进。如果需要的话(在functions.php
中放入):function get_avatar_url($get_avatar){
preg_match("/src='(.*?)'/i", $get_avatar, $matches);
return $matches[1];
}
,然后在需要的模板文件中使用它,如下所示:
<img src="<? echo get_avatar_url(get_avatar( $curauth->ID, 150 )); ?>" align="left" class="authorimage" />
更加简单。
在这种情况下,使用RegEx解析HTML是可以的,因为这只会解析一个
img
标记,因此它不会太贵了。#3 楼
您可以使用过滤器get_avatar
将所有数据(以及标记内的url)都获取到化身。我认为WP没有头像图片仅返回网址的功能。$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);
还可以在插件或主题中重写此功能,如果此函数名未在其他位置定义,则该函数为onyl活动。
if ( ! function_exists( 'get_avatar' ) ) :
因此可以添加一个参数以仅返回图像的url,像这样,将
$url
与TRUE
一起使用,您将只获得该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('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&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);
}
另一个小变化是,您使用Gravatar规则创建了网址。在您的源代码中使用作者的电子邮件,您将获得图像的URL。
#4 楼
我认为这是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] );
}
#5 楼
get_user_meta($userId, 'simple_local_avatar');
简单本地化身使用元字段来存储化身,因此您可以通过调用
get_user_meta
并获取'simple_local_avatar'字段来简单地检索值。您将返回如下数组:array
(
[full] => 'http://...',
[96] => 'http://...',
[32] => 'http://...'
)
#6 楼
alaap的方法在Wordpress 4.2中不再起作用。我想出了一个解决方案。它在这里并且运行良好:
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; }
在模板中只需使用:
<?php my_gravatar_url() ?>
注意:它必须在循环内使用。
#7 楼
将头像上传到本地后,WP返回带有src属性的img标签,并用双引号引起来,所以我发现此模式效果更好:preg_match("/src=['\"](.*?)['\"]/i", $get_avatar, $matches);
#8 楼
几个小时前,我也在想如何做到这一点。但是,很快我得到了解决方案并制作了插件,请检查get_avatar_url($ user_id,$ size)对您是否有用。谢谢..
插件代码:
/*
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' );
用法:
调用函数:
get_avatar_url( get_the_author_meta( 'user_email'), 150);
使用简码:
do_shortcode('[avatar_url email="' . get_the_author_meta( 'user_email') .'" size=150 ]' );
评论
一个小小的变化... get_avatar函数将src放入“ not'内,因此匹配将为null。正则表达式应为preg_match('/ src =”(。*?)“ / i',$ get_avatar,$ matches) ;
–spdaly
2014-09-17 12:43
谢谢@spdaly-我希望评论能够使作者进行编辑;)-谢谢aalaap
–敏捷的SEO
2014年12月21日,下午3:04
如果您回答了自己的问题,请将其标记为已接受的答案。
–DᴀʀᴛʜVᴀᴅᴇʀ
16年8月1日在17:20
@Darth_Vader自发布问题以来,我再也没有回过头来,所以我不再确定这是否是理想的解决方法。我认为关于4.2+的新答案更好。
– aalaap
16年8月2日在4:02