Make WordPress Core


Ignore:
Timestamp:
01/09/2015 04:42:48 AM (12 years ago)
Author:
pento
Message:

Add get_avatar_url(), for retrieving just the URL of an avatar, rather than the entire <img> tag that get_avatar() produces.

Unlike get_avatar(), get_avatar_url() is not pluggable. It can be extended/or modified through the new filters included.

Fixes #21195.

Props mdawaffe, pento, pathawks, DrewAPicture

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/link-template.php

    r31071 r31107  
    33253325        }
    33263326}
     3327
     3328
     3329/**
     3330 * Retrieve the avatar URL.
     3331 *
     3332 * @since 4.2.0
     3333 *
     3334 * @param mixed $id_or_email The Gravatar to retrieve a URL for. Accepts a user_id, gravatar md5 hash,
     3335 *                           user email, WP_User object, WP_Post object, or comment object.
     3336 * @param array $args        {
     3337 *     Optional. Arguments to return instead of the default arguments.
     3338 *
     3339 *     @type int    $size           Height and width of the avatar in pixels. Default 96.
     3340 *     @type string $default        URL for the default image or a default type. Accepts '404' (return
     3341 *                                  a 404 instead of a default image), 'retro' (8bit), 'monsterid' (monster),
     3342 *                                  'wavatar' (cartoon face), 'indenticon' (the "quilt"), 'mystery', 'mm',
     3343 *                                  or 'mysterman' (The Oyster Man), 'blank' (transparent GIF), or
     3344 *                                  'gravatar_default' (the Gravatar logo). Default is the value of the
     3345 *                                  'avatar_default' option, with a fallback of 'mystery'.
     3346 *     @type bool   $force_default  Whether to always show the default image, never the Gravatar. Default false.
     3347 *     @type string $rating         What rating to display avatars up to. Accepts 'G', 'PG', 'R', 'X', and are
     3348 *                                  judged in that order. Default is the value of the 'avatar_rating' option.
     3349 *     @type string $scheme         URL scheme to use. See {@see set_url_scheme()} for accepted values.
     3350 *                                  Default null.
     3351 *     @type array  $processed_args When the function returns, the value will be the processed/sanitized $args
     3352 *                                  plus a "found_avatar" guess. Pass as a reference. Default null.
     3353 * }
     3354 *
     3355 * @return false|string The URL of the avatar we found, or false if we couldn't find an avatar.
     3356 */
     3357function get_avatar_url( $id_or_email, $args = null ) {
     3358        $args = get_avatar_data( $id_or_email, $args );
     3359        return $args['url'];
     3360}
     3361
     3362/**
     3363 * Retrieve default data about the avatar.
     3364 *
     3365 * @since 4.2.0
     3366 *
     3367 * @param mixed $id_or_email The Gravatar to check the data against. Accepts a user_id, gravatar md5 hash,
     3368 *                           user email, WP_User object, WP_Post object, or comment object.
     3369 * @param array $args        {
     3370 *     Optional. Arguments to return instead of the default arguments.
     3371 *
     3372 *     @type int    $size           Height and width of the avatar in pixels. Default 96.
     3373 *     @type string $default        URL for the default image or a default type. Accepts '404' (return
     3374 *                                  a 404 instead of a default image), 'retro' (8bit), 'monsterid' (monster),
     3375 *                                  'wavatar' (cartoon face), 'indenticon' (the "quilt"), 'mystery', 'mm',
     3376 *                                  or 'mysterman' (The Oyster Man), 'blank' (transparent GIF), or
     3377 *                                  'gravatar_default' (the Gravatar logo). Default is the value of the
     3378 *                                  'avatar_default' option, with a fallback of 'mystery'.
     3379 *     @type bool   $force_default  Whether to always show the default image, never the Gravatar. Default false.
     3380 *     @type string $rating         What rating to display avatars up to. Accepts 'G', 'PG', 'R', 'X', and are
     3381 *                                  judged in that order. Default is the value of the 'avatar_rating' option.
     3382 *     @type string $scheme         URL scheme to use. See {@see set_url_scheme()} for accepted values.
     3383 *                                  Default null.
     3384 *     @type array  $processed_args When the function returns, the value will be the processed/sanitized $args
     3385 *                                  plus a "found_avatar" guess. Pass as a reference. Default null.
     3386 * }
     3387 *
     3388 * @return array $processed_args {
     3389 *     Along with the arguments passed in $args, this will contain a couple of extra arguments.
     3390 *
     3391 *     @type bool         $found_avatar True if we were able to find an avatar for this user,
     3392 *                                      false or not set if we couldn't.
     3393 *     @type false|string $url          The URL of the avatar we found, or false if we couldn't find an avatar.
     3394 * }
     3395 */
     3396function get_avatar_data( $id_or_email, $args = null ) {
     3397        $args = wp_parse_args( $args, array(
     3398                'size'           => 96,
     3399                'default'        => get_option( 'avatar_default', 'mystery' ),
     3400                'force_default'  => false,
     3401                'rating'         => get_option( 'avatar_rating' ),
     3402                'scheme'         => null,
     3403                'processed_args' => null, // if used, should be a reference
     3404        ) );
     3405
     3406        if ( is_numeric( $args['size'] ) ) {
     3407                $args['size'] = absint( $args['size'] );
     3408                if ( ! $args['size'] ) {
     3409                        $args['size'] = 96;
     3410                }
     3411        } else {
     3412                $args['size'] = 96;
     3413        }
     3414
     3415        if ( empty( $args['default'] ) ) {
     3416                $args['default'] = 'mystery';
     3417        }
     3418
     3419        switch ( $args['default'] ) {
     3420                case 'mm' :
     3421                case 'mystery' :
     3422                case 'mysteryman' :
     3423                        $args['default'] = 'mm';
     3424                        break;
     3425                case 'gravatar_default' :
     3426                        $args['default'] = false;
     3427                        break;
     3428        }
     3429
     3430        $args['force_default'] = (bool) $args['force_default'];
     3431
     3432        $args['rating'] = strtolower( $args['rating'] );
     3433
     3434        $args['found_avatar'] = false;
     3435
     3436        /**
     3437         * Filter whether to retrieve the avatar URL early.
     3438         *
     3439         * Passing a non-null value in the 'url' member of the return array will
     3440         * effectively short circuit {@see get_avatar_data()}, passing the value
     3441         * through the 'get_avatar_data' filter and returning early.
     3442         *
     3443         * @since 4.2.0
     3444         *
     3445         * @param array             $args          Arguments passed to get_avatar_data(), after processing.
     3446         * @param int|object|string $id_or_email   A user ID, email address, or comment object.
     3447         */
     3448        $args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email );
     3449
     3450        if ( isset( $args['url'] ) && ! is_null( $args['url'] ) ) {
     3451                /** This filter is documented in src/wp-includes/link-template.php */
     3452                return apply_filters( 'get_avatar_data', $args, $id_or_email );
     3453        }
     3454
     3455        $email_hash = '';
     3456        $user = $email = false;
     3457
     3458        // Process the user identifier.
     3459        if ( is_numeric( $id_or_email ) ) {
     3460                $user = get_user_by( 'id', absint( $id_or_email ) );
     3461        } elseif ( is_string( $id_or_email ) ) {
     3462                if ( strpos( $id_or_email, '@md5.gravatar.com' ) ) {
     3463                        // md5 hash
     3464                        list( $email_hash ) = explode( '@', $id_or_email );
     3465                } else {
     3466                        // email address
     3467                        $email = $id_or_email;
     3468                }
     3469        } elseif ( $id_or_email instanceof WP_User ) {
     3470                // User Object
     3471                $user = $id_or_email;
     3472        } elseif ( $id_or_email instanceof WP_Post ) {
     3473                // Post Object
     3474                $user = get_user_by( 'id', (int) $id_or_email->post_author );
     3475        } elseif ( is_object( $id_or_email ) && isset( $id_or_email->comment_ID ) ) {
     3476                // Comment Object
     3477
     3478                /**
     3479                 * Filter the list of allowed comment types for retrieving avatars.
     3480                 *
     3481                 * @since 3.0.0
     3482                 *
     3483                 * @param array $types An array of content types. Default only contains 'comment'.
     3484                 */
     3485                $allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );
     3486                if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) ) {
     3487                        $args['url'] = false;
     3488                        /** This filter is documented in src/wp-includes/link-template.php */
     3489                        return apply_filters( 'get_avatar_data', $args, $id_or_email );
     3490                }
     3491
     3492                if ( ! empty( $id_or_email->user_id ) ) {
     3493                        $user = get_user_by( 'id', (int) $id_or_email->user_id );
     3494                }
     3495                if ( ( ! $user || is_wp_error( $user ) ) && ! empty( $id_or_email->comment_author_email ) ) {
     3496                        $email = $id_or_email->comment_author_email;
     3497                }
     3498        }
     3499
     3500        if ( ! $email_hash ) {
     3501                if ( $user ) {
     3502                        $email = $user->user_email;
     3503                }
     3504
     3505                if ( $email ) {
     3506                        $email_hash = md5( strtolower( trim( $email ) ) );
     3507                }
     3508        }
     3509
     3510        if ( $email_hash ) {
     3511                $args['found_avatar'] = true;
     3512                $gravatar_server = hexdec( $email_hash[0] ) % 3;
     3513        } else {
     3514                $gravatar_server = rand( 0, 2 );
     3515        }
     3516
     3517        $url_args = array(
     3518                's' => $args['size'],
     3519                'd' => $args['default'],
     3520                'f' => $args['force_default'] ? 'y' : false,
     3521                'r' => $args['rating'],
     3522        );
     3523
     3524        $url = sprintf( 'http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash );
     3525
     3526        $url = add_query_arg(
     3527                rawurlencode_deep( array_filter( $url_args ) ),
     3528                set_url_scheme( $url, $args['scheme'] )
     3529        );
     3530
     3531        /**
     3532         * Filter the avatar URL.
     3533         *
     3534         * @since 4.2.0
     3535         *
     3536         * @param string            $url           The URL of the avatar.
     3537         * @param int|object|string $id_or_email   A user ID, email address, or comment object.
     3538         * @param array             $args          Arguments passed to get_avatar_data(), after processing.
     3539         */
     3540        $args['url'] = apply_filters( 'get_avatar_url', $url, $id_or_email, $args );
     3541
     3542        /**
     3543         * Filter the avatar data.
     3544         *
     3545         * @since 4.2.0
     3546         *
     3547         * @param array             $args          Arguments passed to get_avatar_data(), after processing.
     3548         * @param int|object|string $id_or_email   A user ID, email address, or comment object.
     3549         */
     3550        $args = apply_filters( 'get_avatar_data', $args, $id_or_email );
     3551
     3552        // Don't return a broken URL if we couldn't find the email hash, and none of the filters returned a different URL.
     3553        if ( ! $email_hash && $url === $args['url'] ) {
     3554                $args['url'] = false;
     3555        }
     3556
     3557        return $args;
     3558}
Note: See TracChangeset for help on using the changeset viewer.