WordPress как на ладони
wordpress jino

get_avatar_url() WP 4.2.0

Получает ссылку на аватар, по переданному email, ID или объекту пользователя. Также можно передать объект поста или комментария.

Эта функция не проверят если ли реально аватар, она просто собирает URL на сервис gravatar.com. Чтобы проверить если ли у email аватар, вам нужно обработать полученный URL отдельно. Нужно указать в default 404, затем получить URL и попробовать получить картинку по этому URL через get_headers(). Если ответ вернет 404, то аватарки у email нет. См. примеры.

Смотрите также функцию get_avatar().

Используется в: get_avatar().
Работает на основе: get_avatar_data()
✈ 1 раз = 0.00008с = очень быстро | 50000 раз = 1.67с = быстро PHP 7.0.8, WP 4.5.3

Хуков нет.

Возвращает

Строку/false. УРЛ аватара (возвращается в 99% случаев). false, если в работе функции что-то пошло не так и не удалось собрать URL.

Использование

get_avatar_url( $id_or_email, $args );
$id_or_email(смешанный) (обязательный)

Идентификатор по которому будет определяться аватар. Может быть:

  • ID пользователя; email пользователя;
  • gravatar md5 хэш (md5 хэш мыла);
  • WP_User объект;
  • WP_Post объект - получит аватар автора поста;
  • WP_Comment объект - получит аватар комментатора.
$args(массив)

Параметры получаемого аватара. По умолчанию:

  • size (число)
    Высота и ширина аватара в пикселях.
    По умолчанию: 96
  • default (строка)
    УРЛ на картинку по умолчанию - если не удалось получить аватар. Вместо УРЛ можно указать следующие значения:

    • 404 - вернет 404 вместо дефолтной картинки.
    • retro - пиксельная картинка 8bit: ,
    • monsterid - монстрик: ,
    • wavatar - мульт лицо: ,
    • indenticon - картинка-узор: ,
    • mystery, 'mm' или 'mysterman' - неизвестный человек: ,
    • blank - прозрачная GIF картинка,
    • gravatar_default - логотип Gravatar: .

    По умолчанию: значение опции 'avatar_default' или 'mystery'

  • force_default (логический)
    Ставим true, если нужно всегда показывать дефолтную картинку и не показывать аватары совсем.
    По умолчанию: false

  • rating (строка)
    Максимально допустимый рейтинг выводимой аватарки. Может быть:

    • G — Подходит для любой аудитории;
    • PG — Может содержать оскорбительные элементы, обычно для аудитории старше 13 лет;
    • R — Рассчитан на взрослую аудиторию старше 17 лет;
    • X — Для ещё более зрелой аудитории;

    По умолчанию: значение опции 'avatar_rating'

  • scheme (строка)
    Схема УРЛ, которая будет использоваться. Может быть: 'http', 'https', 'login', 'login_post', 'admin', or 'relative'. Подробнее смотрите функцию set_url_scheme().
    По умолчанию: null

  • processed_args (массив)
    Дополнительные опции для передачи. При фильтрации и возврате данных функцией get_avatar_data() эти параметры будут добавлены в возвращаемый массив.
    По умолчанию: null

  • extra_attr (строка)
    HTML атрибуты для добавления к элементу IMG. Не очищаются.
    По умолчанию: ''

По умолчанию: null

Примеры

#1 Получим УРЛ аватарки по email юзера

$url = get_avatar_url( 'asd@dsf.df', array(
	'size' => 48,
	'default'=>'identicon',
) );

// вернет: http://1.gravatar.com/avatar/4b508f04b661ba693130539bd29f5c0d?s=48&d=identicon&r=g

#2 Получим УРЛ аватарки текущего пользователя

$url = get_avatar_url( $GLOBALS['current_user'], array(
	'size' => 48,
	'default'=>'wavatar',
) );

// вернет: http://1.gravatar.com/avatar/155e695ab2251ee3c482c1e3e690683b?s=48&d=identicon&r=g

#3 Выведем картинку-аватарку автора текущей статьи

global $post;
$url = get_avatar_url( $post, "size=24&default=monsterid");
$img = '<img alt="" src="'. $url .'">';
echo $img;

// вернет: <img alt="" src="http://1.gravatar.com/avatar/155e695ab2251ee3c482c1e3e690683b?s=24&d=wavatar&r=g">

#4 Проверка есть ли аватар у email

Чтобы проверить если ли у email аватар, нужно обработать URL граватара отдельно. В параметре default указать 404, затем получить URL и попробовать получить картинку по этому URL через get_headers(). Если ответ вернет 404, то аватарки у email нет.

// проверка есть ли аватар у email
function has_gravatar( $email ){
	$gravatar_url = get_avatar_url( $email, 'default=404' );
	$headers = @ get_headers( $gravatar_url  );
	return ! preg_match('|404|', $headers[0] );
}

var_dump( has_gravatar('has_ava@bk.ru') ); // true
var_dump( has_gravatar('no__ava@bk.ru') ); // false

// время выполнения от 0,1 до 1 секунды... очень долго - это HTTP запрос...

Такая проверка запроса будет сильно тормозить загрузку сайта, но если очень нужно, то запрос можно куда-нибудь кэшировать, например в set_transient()...

Код get avatar url: wp-includes/link-template.php WP 4.8.2

<?php
function get_avatar_url( $id_or_email, $args = null ) {
	$args = get_avatar_data( $id_or_email, $args );
	return $args['url'];
}

Cвязанные функции

Из метки: avatar (аватар)

Еще из раздела: Комментарии

get_avatar_url 7 комментариев
  • Анна

    В каком случае функция возвращает false? У меня она всегда возвращает строку, даже если у пользователя нет аватарки.

    Ответить1.5 года назад #
    • Kama4464

      Дописал:

      Эта функция не проверят если ли реально аватар, она просто собирает URL на сервис gravatar.com, чтобы проверить если ли у email аватар, вам нужно отдельно обработаться полученных URL. Например указать в default 404, затем получить URL и попробовать получить картинку по этому URL через get_headers(). Если ответ вернет 404, то аватарки у email нет.

      // проверка есть ли аватар у email
      function has_gravatar( $email ){
      	$gravatar_url = get_avatar_url( $email ). '&d=404';
      	$headers = @ get_headers( $gravatar_url  );
      	return ! preg_match("|404|", $headers[0] );
      }
      
      var_dump( has_gravatar('has_ava@bk.ru') ); // true
      var_dump( has_gravatar('no__ava@bk.ru') ); // false
      
      // время выполнения от 0,1 до 1 секунды... очень долго - это HTTP запрос...

      Вам зачем это нужно? по идее всегда нужно, если нет аватара показать дефолтную картинку... Проверять запрос - это будет тормозить загрузку сайта, но если очень нужно, то можно конечно запрос закэшировать куда-нибудь...

      1
      Ответить1.5 года назад #
      • Анна

        Спасибо за подробный ответ!
        Да, именно этот способ я в итоге и пробовала. И он действительно очень медленный, поэтому от него отказалась.
        А нужно было это реализовать как раз для увеличения быстродействия сайта)) Чтобы не загружать каждый раз дефолтные катринки. Например, у меня на сайте, 90% пользователей без аватаров, и для каждого пользователя загружается дефолтная картинка с сервера по новому адресу. Вот и хотелось проверять, если нет аватара, но ничего и не загружать)
        Но уже все сделала в обход этого метода с помощью кэширования и базы данных.

        Ответить1.5 года назад #
  • campusboy1848 cайт: wp-plus.ru

    На мой взгляд, проверять на 404 ошибку не лучшая затея, так как это в большинстве случаев очень долго, а если это список с комментариями, то вообще атас. И тут вижу два решения:
    1) Использовать JS (есть такие библиотеки, при 404 от картинки подставляют дефолтную / наверное и AJAX можно попробовать получить);
    2) Раз в период (неделю к примеру) пробегать по всем emal'ам и сохранять аватарки в мета-поле для комментариев или ещё где).

    Ответить1.1 года назад #
    • campusboy1848 cайт: wp-plus.ru

      И ещё, если вардампить:

      $ava_data = get_avatar_data('xxxxxxxxxxxxxxx@gmail.com');
      var_dump( $ava_data );

      То как ни крути в массиве выпадает:

      'found_avatar' => boolean true

      какой бы адрес не ввёл, на кой тогда этот параметр не понятно.

      И ещё - на по любой ссылке какую б ни генерировал - перехожу и получаю 200 ответ, так как вы там собрались get_headers() орудовать мне тоже не ясно smile

      Подытожу. Код:

      $ava_data = get_avatar_data('xxxxxxxxxxxxasdfasdfasdfxxx@gmail.com');
      
      var_dump( $ava_data );
      
      var_dump( get_headers($ava_data['url'])) ;

      Результат:

      array (size=11)
        'size' => int 96
        'height' => int 96
        'width' => int 96
        'default' => string 'mm' (length=2)
        'force_default' => boolean false
        'rating' => string 'g' (length=1)
        'scheme' => null
        'processed_args' => null
        'extra_attr' => string '' (length=0)
        'found_avatar' => boolean true
        'url' => string 'http://0.gravatar.com/avatar/06c69ad285ede91eca24d4acbc2053e9?s=96&d=mm&r=g' (length=75)
      
      array (size=16)
        0 => string 'HTTP/1.0 200 OK' (length=15)
        1 => string 'Accept-Ranges: bytes' (length=20)
        2 => string 'Access-Control-Allow-Origin: *' (length=30)
        3 => string 'Cache-Control: max-age=300' (length=26)
        4 => string 'Content-Disposition: inline; filename="06c69ad285ede91eca24d4acbc2053e9.png"' (length=76)
        5 => string 'Content-Type: image/jpeg' (length=24)
        6 => string 'Date: Mon, 25 Jul 2016 21:34:14 GMT' (length=35)
        7 => string 'Expires: Mon, 25 Jul 2016 21:39:14 GMT' (length=38)
        8 => string 'Last-Modified: Wed, 11 Jan 1984 08:00:00 GMT' (length=44)
        9 => string 'Link: <http://www.gravatar.com/avatar/06c69ad285ede91eca24d4acbc2053e9?s=96&d=mm&r=g>; rel="canonical"' (length=102)
        10 => string 'Server: nginx' (length=13)
        11 => string 'Source-Age: 272' (length=15)
        12 => string 'Via: 1.1 varnish' (length=16)
        13 => string 'X-Varnish: 4016936395 4016117613' (length=32)
        14 => string 'Content-Length: 1528' (length=20)
        15 => string 'Connection: close' (length=17)
      1
      Ответить1.1 года назад #
    • campusboy1848 cайт: wp-plus.ru

      Вот так можно дёрнуть можно данные:

      $md5_email = md5('info@site.ru');
      $url = 'http://gravatar.com/'.$md5_email.'.json';
      $result = wp_remote_get( $url );
      var_dump( $result );
      var_dump( json_decode($result['body']) );

      В данном примере будет ответ:

      array (size=5)
        'headers' => 
      	array (size=11)
      	  'server' => string 'nginx' (length=5)
      	  'date' => string 'Mon, 25 Jul 2016 22:10:12 GMT' (length=29)
      	  'content-type' => string 'application/json' (length=16)
      	  'connection' => string 'close' (length=5)
      	  'vary' => string 'Accept-Encoding' (length=15)
      	  'p3p' => string 'CP="CAO PSA"' (length=12)
      	  'expires' => string 'Wed, 11 Jan 1984 05:00:00 GMT' (length=29)
      	  'last-modified' => string 'Mon, 25 Jul 2016 22:10:12 GMT' (length=29)
      	  'cache-control' => string 'no-cache, must-revalidate, max-age=0' (length=36)
      	  'pragma' => string 'no-cache' (length=8)
      	  'x-frame-options' => string 'SAMEORIGIN' (length=10)
        'body' => string '"User not found"' (length=16)
        'response' => 
      	array (size=2)
      	  'code' => int 404
      	  'message' => string 'Not Found' (length=9)
        'cookies' => 
      	array (size=0)
      	  empty
        'filename' => null

      А если подставить правильную почту, к примеру мою, то:

      array (size=5)
        'headers' => 
      	array (size=11)
      	  'server' => string 'nginx' (length=5)
      	  'date' => string 'Mon, 25 Jul 2016 22:13:14 GMT' (length=29)
      	  'content-type' => string 'application/json' (length=16)
      	  'connection' => string 'close' (length=5)
      	  'vary' => string 'Accept-Encoding' (length=15)
      	  'p3p' => string 'CP="CAO PSA"' (length=12)
      	  'pragma' => string 'no-cache' (length=8)
      	  'x-frame-options' => string 'SAMEORIGIN' (length=10)
      	  'expires' => string 'Mon, 25 Jul 2016 22:28:14 GMT' (length=29)
      	  'last-modified' => string 'Mon, 25 Jul 2016 22:13:14 GMT' (length=29)
      	  'cache-control' => string 'max-age=900' (length=11)
        'body' => string '{"entry":[{"id":"95508061","hash":"34c2848cae5cd8fd2b9589b2ba4aa9b3","requestHash":"34c2848cae5cd8fd2b9589b2ba4aa9b3","profileUrl":"http:\/\/gravatar.com\/campusboy1987","preferredUsername":"campusboy1987","thumbnailUrl":"http:\/\/0.gravatar.com\/avatar\/34c2848cae5cd8fd2b9589b2ba4aa9b3","photos":[{"value":"http:\/\/0.gravatar.com\/avatar\/34c2848cae5cd8fd2b9589b2ba4aa9b3","type":"thumbnail"}],"name":[],"displayName":"campusboy1987","urls":[]}]}' (length=449)
        'response' => 
      	array (size=2)
      	  'code' => int 200
      	  'message' => string 'OK' (length=2)
        'cookies' => 
      	array (size=0)
      	  empty
        'filename' => null
      object(stdClass)[7802]
        public 'entry' => 
      	array (size=1)
      	  0 => 
      		object(stdClass)[7820]
      		  public 'id' => string '95508061' (length=8)
      		  public 'hash' => string '34c2848cae5cd8fd2b9589b2ba4aa9b3' (length=32)
      		  public 'requestHash' => string '34c2848cae5cd8fd2b9589b2ba4aa9b3' (length=32)
      		  public 'profileUrl' => string 'http://gravatar.com/campusboy1987' (length=33)
      		  public 'preferredUsername' => string 'campusboy1987' (length=13)
      		  public 'thumbnailUrl' => string 'http://0.gravatar.com/avatar/34c2848cae5cd8fd2b9589b2ba4aa9b3' (length=61)
      		  public 'photos' => 
      			array (size=1)
      			  0 => 
      				object(stdClass)[7848]
      				  public 'value' => string 'http://0.gravatar.com/avatar/34c2848cae5cd8fd2b9589b2ba4aa9b3' (length=61)
      				  public 'type' => string 'thumbnail' (length=9)
      		  public 'name' => 
      			array (size=0)
      			  empty
      		  public 'displayName' => string 'campusboy1987' (length=13)
      		  public 'urls' => 
      			array (size=0)
      			  empty
      

      Судя по этим ответам от сервера в формате json вижу самым оптимальным (быстрым) решением делать AJAX запросы на основе md5 email'ов и если возвращается ответ с картиной - ставить, иначе дефолтное значение. Иначе (методами php) в среднем на запрос тратится 0,5с (столько времени отвечает сервер граватара).

      1
      Ответить1.1 года назад #
    • campusboy1848 cайт: wp-plus.ru

      Последнее, что хотел бы сказать. Что функцию get_avatar_url() можно доработать, точнее обработать её ответ, удалив все GET параметры, которые возвращаются и при выводе добавить свой GET параметр ?d=blank, который вывед прозрачную PNG, если аватарки для данного мыла не нашлось, а это удобно - можно же с помощью CSS делать фон блоку в виде своих картинок, в котором предполагается выводиться аватарка. Если её нет, "просветится" бэкграунд. Подробнее о картинках граватара.

      1
      Ответить1.1 года назад #

Здравствуйте, !

Ваш комментарий