ฉันจะรับ avatar URL แทนแท็ก IMG HTML ได้อย่างไรเมื่อใช้ get_avatar


28

ฉันใช้ปลั๊กอินชื่อSimple Local Avatarsซึ่งให้ฉันอัปโหลดภาพผู้แต่งซึ่งเก็บไว้ในเซิร์ฟเวอร์ของฉันในเครื่อง (ไม่มี Gravatar) ปลั๊กอินทำงานได้ดีและget_avatarส่งคืนอวตารท้องถิ่น

อย่างไรก็ตามฉันต้องใช้ Avatar ในวิธีที่แตกต่างกันและสถานที่ที่แตกต่างกันและเพื่อที่ฉันต้องการ URL รูปภาพประจำตัวท้องถิ่นแทนที่จะเป็นแท็ก HTML ทั้งหมด ฉันสามารถเขียนฟังก์ชั่น wrapper สำหรับget_avatarที่ใช้ RegEx หรือ SimpleXML เพื่อเลือกและกลับเฉพาะ URL แต่ฉันสงสัยว่ามีวิธีการทำเช่นนี้อยู่หรือไม่

คำตอบ:


26

ข่าวดีสำหรับ 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_dataget_avatar_data

หลังจากอัปเกรดเป็น 4.2 เมื่อเร็ว ๆ นี้ฉันมีปัญหากับชุดรูปแบบที่กำหนดว่าเป็นรุ่นของตัวเองget_avatar_url()โดยไม่ต้องใส่ชื่อฟังก์ชั่นหรือfunction_exists()ตรวจสอบ นี่คือตัวอย่างของสาเหตุที่สำคัญ ;-)


25

คำตอบข้างต้นดูเหมือนจะครอบคลุม แต่ฉันเพิ่งเขียนฟังก์ชันตัวคลุมและย้ายไป นี่คือถ้าคุณต้องการ (ใส่ใน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แท็กเพียงแท็กเดียวดังนั้นมันจะไม่แพงเกินไป


5
การเปลี่ยนแปลงเล็กน้อย ... ฟังก์ชั่น get_avatar ทำให้ src อยู่ภายใน "ไม่ 'ดังนั้นการแข่งขันจะเป็นโมฆะ regex ควรเป็น preg_match (' / src =" (. *?) "/ i ', $ get_avatar, $ ตรงกัน) ;
spdaly

Thanks @spdaly - ฉันหวังว่าการแสดงความคิดเห็นจะทำให้ผู้เขียนสามารถแก้ไข;) - Thanks aalaap
Sagive SEO

หากคุณตอบคำถามของคุณเองโปรดทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับได้
DᴀʀᴛʜVᴀᴅᴇʀ

@Darth_Vader ฉันไม่ได้กลับไปที่เรื่องนี้ตั้งแต่ฉันโพสต์คำถามดังนั้นฉันไม่แน่ใจอีกต่อไปว่านี่เป็นวิธีที่เหมาะสมที่สุดที่จะทำ ฉันคิดว่าคำตอบใหม่เกี่ยวกับ 4.2+ นั้นดีกว่า
aalaap

6

คุณสามารถใช้ตัวกรอง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);
}

อีกหนึ่งตัวแปรย่อยคือคุณสร้าง URL ด้วยกฎของ Gravatar

function get_gravatar_url( $email ) {

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

ใช้สิ่งนี้ในแหล่งที่มาของคุณพร้อมกับอีเมลของผู้แต่งและคุณจะได้รับ URL ของภาพนั้น


2

ฉันคิดว่านี่เป็นคำตอบที่ดีกว่าของ 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');

Simple Local Avatarsใช้เขตข้อมูลเมตาเพื่อจัดเก็บอวาตาร์ดังนั้นคุณสามารถเรียกคืนค่าได้ง่ายๆโดยการโทรget_user_metaและคว้าฟิลด์ 'simple_local_avatar' คุณจะได้รับอาร์เรย์กลับคืนดังนี้:

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

1

วิธีการของ 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() ?>

ข้อสังเกต: จะต้องใช้ภายในลูป


0

เมื่ออวตารได้รับการอัปโหลดแบบโลคัล WP จะส่งคืนแท็ก img ด้วยแอ็ตทริบิวต์ src ในเครื่องหมายคำพูดคู่ดังนั้นฉันจึงพบว่ารูปแบบนี้ทำงานได้ดีกว่า:

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

0

ไม่กี่ชั่วโมงที่ผ่านมาฉันก็สงสัยว่าจะทำยังไง แต่เร็ว ๆ นี้ฉันได้รับการแก้ปัญหาและสร้างปลั๊กอินโปรดตรวจสอบว่าget_avatar_url ($ user_id ขนาด $) ทำงานให้คุณได้หรือไม่ ขอบคุณ ..

รหัสปลั๊กอิน:

/*
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 ]' );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.