it-swarm.com.de

Wie erhalte ich bei Verwendung von get_avatar die Avatar-URL anstelle eines HTML-IMG-Tags?

Ich verwende ein Plugin namens Simple Local Avatars , mit dem ich Autorenbilder hochladen kann, die lokal auf meinem Server gespeichert sind (kein Gravatar). Das Plugin funktioniert einwandfrei und get_avatar gibt den lokalen Avatar zurück.

Ich muss diesen Avatar jedoch auf unterschiedliche Art und Weise und an unterschiedlichen Orten verwenden. Dazu benötige ich die URL des lokalen Avatar-Bildes anstelle des gesamten HTML-Tags. Ich könnte eine Wrapper-Funktion für get_avatar schreiben, die RegEx oder SimpleXML verwendet, um nur die URL auszuwählen und zurückzugeben, aber ich habe mich gefragt, ob es dafür eine Möglichkeit gibt.

28
aalaap

Gute Nachrichten für WordPress-Versionen 4.2+

Seit Version 4.2 wird die Funktion handy get_avatar_url(), die als Feature Request im Ticket eingeführt wurde # 21195 vor einigen Jahren jetzt mit dem Kern ausgeliefert :

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

dabei ist get_avatar_data() auch eine neue Hilfsfunktion.

Es enthält diesen Codeteil:

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

wo wir sehen können, dass die verfügbaren Filter pre_get_avatar_data und get_avatar_data sind, wenn der Parameter url gesetzt ist.

Nachdem ich kürzlich ein Upgrade auf 4.2 durchgeführt hatte, hatte ich ein Problem mit einem Thema, das eine eigene Version von get_avatar_url() definierte, ohne das Präfix Funktionsname oder eine function_exists()-Prüfung. Das ist also ein Beispiel dafür, warum das wichtig ist ;-)

26
birgire

Die Antwort oben scheint umfassend zu sein, aber ich habe gerade eine Wrapper-Funktion geschrieben und bin weitergegangen. Hier ist es, wenn Sie es brauchen (setzen Sie dies in functions.php):

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

und benutze es dann wie folgt in den Vorlagendateien:

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

Es ist nur einfacher.

In diesem Fall ist es in Ordnung, RegEx zum Parsen von HTML zu verwenden, da hierbei nur ein img -Tag analysiert wird, sodass dies nicht zu kostspielig ist.

25
aalaap

Sie können den Filter get_avatar verwenden, um alle Daten zum Avatar abzurufen, auch die URL innerhalb des Markups. Ich denke, WP hat keine Funktion, um nur die URL des Avatar-Bildes zurückzugeben.

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

Sie können diese Funktion auch innerhalb eines Plugins oder Themas umschreiben. Die Funktion ist nur aktiv, wenn dieser Funktionsname nicht an einer anderen Stelle definiert ist.

if ( ! function_exists( 'get_avatar' ) ) :

So ist es möglich, einen Parameter hinzuzufügen, um nur die URL des Bildes zurückzugeben, so verwenden Sie den Parameter $url mit TRUE und Sie erhalten nur die 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('[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&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);
}

Eine weitere kleine Variante ist, dass Sie die URL mit der Regel von Gravatar erstellen.

function get_gravatar_url( $email ) {

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

verwenden Sie dies auf Ihrer Quelle mit den E-Mails der Autoren und Sie erhalten die URL von dort Bild.

6
bueltge

Ich denke, dies ist eine bessere Version von Aalaaps Antwort:

// 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] );
}
2
Justin
get_user_meta($userId, 'simple_local_avatar');

Einfache lokale Avatare verwendet Metafelder zum Speichern des Avatars, sodass Sie die Werte einfach abrufen können, indem Sie get_user_meta aufrufen und das Feld 'simple_local_avatar' abrufen. Sie erhalten ein Array wie folgt zurück:

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

die Methode von alaap funktioniert in Wordpress 4.2 nicht mehr

Ich habe eine Lösung gefunden. Hier ist es und es funktioniert gut:

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

in Template einfach benutzen:

<?php my_gravatar_url() ?>

Hinweis: Es muss innerhalb einer Schleife verwendet werden.

1
Devi

Wenn der Avatar lokal hochgeladen wurde, gibt WP das img-Tag mit dem src-Attribut in doppelten Anführungszeichen zurück, sodass ich fand, dass dieses Muster besser funktioniert:

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

Vor ein paar Stunden habe ich mich gefragt, wie ich das auch machen soll. Aber bald habe ich die Lösung gefunden und ein Plugin erstellt. Bitte überprüfen Sie, ob get_avatar_url ($ user_id, $ size) für Sie funktioniert oder nicht. Vielen Dank..

Plugin-Code:

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

Verwendung:

Aufrufen der Funktion:

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

Verwenden des Shortcodes:

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