在使用Get_Avtal时,如何获取头像URL而不是HTML img标记?

时间:2012-07-24 作者:aalaap

我正在使用一个名为Simple Local Avatars 这让我可以上传存储在本地服务器上的作者图像(无Gravatar)。插件工作正常get_avatar 返回本地化身。

然而,我需要以不同的方式和不同的位置使用该化身,为此,我需要本地化身图像URL,而不是整个HTML标记。我可以为get_avatar 它使用RegEx或SimpleXML来挑选并只返回URL,但我想知道是否有任何现有的方法可以做到这一点。

8 个回复
最合适的回答,由SO网友:birgire 整理而成

WordPress 4.2版的好消息get_avatar_url() 功能,作为功能请求引入#21195 几年前,now ships with the core:

/**
 * 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_dataget_avatar_data.

最近升级到4.2之后,我遇到了一个主题问题,该主题定义了自己的版本get_avatar_url(), 没有任何函数名前缀或function_exists() 检查这就是为什么这很重要的一个例子;-)

SO网友:aalaap

上面的答案似乎很全面,但我只是编写了一个包装函数,然后继续。如果你需要的话,给你(把这个放进去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 标签,所以不会太贵。

SO网友:bueltge

您可以使用过滤器get_avatar 为了将所有数据获取到头像,还需要标记内的url。我认为,WP没有一个只返回url的函数,如果是头像图像。

$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);
此外,您还可以在插件或主题中重写此函数,如果此函数名称未在其他位置定义,则此函数仅处于活动状态。

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&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);
}
另一个小变体是,使用Gravatar规则创建url。

function get_gravatar_url( $email ) {

    $hash = md5( strtolower( trim ( $email ) ) );
    return \'http://gravatar.com/avatar/\' . $hash;
}
在你的源代码和作者的电子邮件中使用这个,你就可以得到那里图像的url。

SO网友:Justin

我认为这是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] );
}

SO网友:Jon

get_user_meta($userId, \'simple_local_avatar\');
Simple Local Avatars 使用元字段存储化身,因此您可以通过调用get_user_meta 抓取“simple\\u local\\u avatar”字段。返回的数组如下:

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

SO网友:Devi

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() ?>
注意:它必须在循环内使用。

SO网友:Nik Dow

当头像在本地上传时,WP返回img标签,并用双引号括起src属性,因此我发现这种模式效果更好:

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

SO网友:Faizan Ali

几个小时前,我也在想怎么做。但是,很快我得到了解决方案并制作了一个插件,请检查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\' );

Usage:

调用函数:

get_avatar_url( get_the_author_meta( \'user_email\'), 150);
使用快捷码:

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

结束

相关推荐

Illegal characters in URLs

我有一些旧的永久链接(帖子、页面、标签),其中现在包含非法字符,这些已经不起作用了。在之前的WP版本中,允许使用非拉丁字符,但在新版本中有所改变。有没有办法从这些永久链接中清除数据库(将它们转换为允许的格式)?