Làm cách nào để có được URL hình đại diện thay vì thẻ HTML IMG khi sử dụng get_avatar?


28

Tôi đang sử dụng một plugin có tên Simple Local Avatars cho phép tôi tải lên hình ảnh tác giả được lưu trữ trên máy chủ của mình (không có Gravatar). Plugin hoạt động tốt và get_avatartrả về avatar cục bộ.

Tuy nhiên, tôi cần sử dụng hình đại diện đó theo những cách khác nhau và những nơi khác nhau và vì thế tôi cần URL hình ảnh đại diện cục bộ thay vì toàn bộ thẻ HTML. Tôi có thể viết hàm bao bọc cho get_avatarsử dụng RegEx hoặc SimpleXML để chọn và chỉ trả lại URL, nhưng tôi tự hỏi liệu có cách nào hiện có để làm điều này không.

Câu trả lời:


26

Tin vui cho các phiên bản WordPress 4.2+

Kể từ phiên bản 4.2 get_avatar_url(), chức năng tiện dụng , được giới thiệu như một yêu cầu tính năng trong vé # 21195 vài năm trước, giờ đây đã xuất xưởng với lõi :

/**
 * 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'];
}

nơi get_avatar_data()cũng là một chức năng trợ giúp mới.

Nó chứa phần mã này:

... 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 ...

nơi chúng ta có thể thấy rằng khi urltham số được đặt, các bộ lọc có sẵn là pre_get_avatar_dataget_avatar_data.

Sau khi nâng cấp lên 4.2 gần đây, tôi gặp vấn đề với một chủ đề xác định phiên bản của chính nó get_avatar_url(), mà không có bất kỳ tiền tố tên hàm hoặc function_exists()kiểm tra nào. Vì vậy, đây là một ví dụ về lý do tại sao điều đó quan trọng ;-)


25

Câu trả lời ở trên có vẻ toàn diện, nhưng tôi chỉ viết một hàm bao bọc và tiếp tục. Đây là nếu bạn cần nó (đặt cái này vào functions.php):

function get_avatar_url($get_avatar){
    preg_match("/src='(.*?)'/i", $get_avatar, $matches);
    return $matches[1];
}

và sau đó sử dụng nó wherver bạn cần nó trong các tệp mẫu như thế này:

<img src="<? echo get_avatar_url(get_avatar( $curauth->ID, 150 )); ?>" align="left" class="authorimage" />

Nó chỉ đơn giản hơn.

Sử dụng RegEx để phân tích HTML trong trường hợp này là được, bởi vì điều này sẽ chỉ phân tích một imgthẻ, vì vậy nó sẽ không quá tốn kém.


5
Một thay đổi nhỏ ... hàm get_avatar đặt src trong "không", do đó, kết quả khớp sẽ là null. Regex nên là preg_match ('/ src = "(. *?)" / I', $ get_avatar, $ khớp) ;
spdaly

cảm ơn @spdaly - tôi hy vọng bình luận sẽ khiến tác giả chỉnh sửa;) - cảm ơn aalaap
Sagive SEO

Nếu bạn trả lời câu hỏi của riêng bạn, vui lòng đánh dấu nó là câu trả lời được chấp nhận.
DVᴀᴅᴇʀ

@Darth_Vader Tôi đã không quay lại vấn đề này kể từ khi tôi đăng câu hỏi, vì vậy tôi không còn chắc chắn liệu đây có phải là cách lý tưởng để làm điều đó không. Tôi nghĩ rằng câu trả lời mới về 4.2+ là tốt hơn.
aalaap

6

Bạn có thể sử dụng bộ lọc get_avatarđể nhận tất cả dữ liệu vào hình đại diện, cũng là url bên trong đánh dấu. Tôi nghĩ, WP không có chức năng chỉ trả lại url nếu hình đại diện.

$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);

Ngoài ra, bạn có thể viết lại chức năng này bên trong một plugin hoặc chủ đề, chức năng này đang hoạt động, nếu tên chức năng này không được xác định ở nơi khác.

if ( ! function_exists( 'get_avatar' ) ) :

Vì vậy, có thể thêm một param để chỉ trả lại url của hình ảnh, như thế này, sử dụng param $urlvới TRUEvà bạn chỉ nhận được 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);
}

Một biến thể nhỏ khác là, bạn tạo url bằng quy tắc Gravatar.

function get_gravatar_url( $email ) {

    $hash = md5( strtolower( trim ( $email ) ) );
    return 'http://gravatar.com/avatar/' . $hash;
}

sử dụng điều này trên nguồn của bạn với email của các tác giả và bạn nhận được url của hình ảnh đó.


2

Tôi nghĩ rằng đây là một phiên bản tốt hơn của câu trả lời của 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] );
}

1
get_user_meta($userId, 'simple_local_avatar');

Avatars đơn giản sử dụng các trường meta để lưu trữ hình đại diện, vì vậy bạn chỉ cần lấy (các) giá trị bằng cách gọi get_user_metavà lấy trường 'simple_local_avatar'. Bạn sẽ nhận được một mảng như vậy:

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

1

Phương thức của alaap không hoạt động nữa trong Wordpress 4.2

Tôi đã đưa ra một giải pháp. Nó đây và nó hoạt động tốt:

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

trong Mẫu chỉ sử dụng:

<?php my_gravatar_url() ?>

Lưu ý: nó phải được sử dụng bên trong một vòng lặp.


0

Khi hình đại diện đã được tải lên cục bộ, WP, trả về thẻ img với thuộc tính src trong dấu ngoặc kép, vì vậy tôi thấy mẫu này hoạt động tốt hơn:

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

0

Vài giờ trước, tôi đã tự hỏi làm thế nào để làm điều đó quá. Nhưng, ngay sau đó tôi đã có giải pháp và tạo một plugin, vui lòng kiểm tra xem get_avatar_url ($ user_id, $ size) có hoạt động với bạn hay không. Cảm ơn..

Mã plugin:

/*
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' );

Sử dụng:

Gọi hàm:

get_avatar_url( get_the_author_meta( 'user_email'), 150);

Sử dụng Shortcode:

do_shortcode('[avatar_url email="' . get_the_author_meta( 'user_email') .'" size=150 ]' );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.