Как получить URL аватара вместо HTML IMG тега при использовании get_avatar?
Я использую плагин Simple Local Avatars, который позволяет загружать изображения авторов, которые хранятся локально на моем сервере (без Gravatar). Плагин работает нормально, и get_avatar
возвращает локальный аватар.
Однако мне нужно использовать этот аватар разными способами и в разных местах, и для этого мне нужен URL изображения локального аватара вместо целого HTML-тега. Я мог бы написать функцию-обертку для get_avatar
, которая использует RegEx или SimpleXML для выбора и возврата только URL, но я хотел узнать, существует ли уже готовый способ сделать это.

Приведенный выше ответ кажется исчерпывающим, но я просто написал обертку-функцию и пошел дальше. Вот она, если вам нужна (поместите это в functions.php
):
function get_avatar_url($get_avatar){
preg_match("/src='(.*?)'/i", $get_avatar, $matches);
return $matches[1];
}
Затем используйте ее в любом месте шаблонных файлов следующим образом:
<img src="<?php echo get_avatar_url(get_avatar( $curauth->ID, 150 )); ?>" align="left" class="authorimage" />
Это просто проще.
Использование RegEx для разбора HTML в данном случае допустимо, потому что он будет обрабатывать только один тег img
, поэтому не будет слишком ресурсозатратным.

Небольшое изменение... функция get_avatar использует кавычки " вместо ', поэтому совпадение будет null. Регулярное выражение должно быть preg_match('/src="(.*?)"/i', $get_avatar, $matches);

спасибо @spdaly - надеюсь, комментарий побудит автора внести правки ;) - спасибо, aalaap

Если вы ответили на свой собственный вопрос, пожалуйста, отметьте его как принятый ответ.

Хорошие новости для WordPress версий 4.2+
Начиная с версии 4.2 удобная функция get_avatar_url()
, введенная как запрос функции в тикете #21195 несколько лет назад, теперь встроена в ядро:
/**
* Получить URL аватара.
*
* @since 4.2.0
*
* @param mixed $id_or_email Gravatar, для которого нужно получить URL. Принимает user_id, хэш md5 граватара,
* email пользователя, объект WP_User, объект WP_Post или объект комментария.
* @param array $args {
* Опционально. Аргументы для возврата вместо аргументов по умолчанию.
*
* @type int $size Высота и ширина аватара в пикселях. По умолчанию 96.
* @type string $default URL для изображения по умолчанию или тип по умолчанию. Принимает '404' (возвращает
* 404 вместо изображения по умолчанию), 'retro' (8-битный), 'monsterid' (монстр),
* 'wavatar' (мультяшное лицо), 'indenticon' ("квадраты"), 'mystery', 'mm',
* или 'mysterman' (The Oyster Man), 'blank' (прозрачный GIF), или
* 'gravatar_default' (логотип Gravatar). По умолчанию значение опции
* 'avatar_default', с резервным вариантом 'mystery'.
* @type bool $force_default Всегда показывать изображение по умолчанию, никогда не показывать Gravatar. По умолчанию false.
* @type string $rating Максимальный рейтинг для отображения аватаров. Принимает 'G', 'PG', 'R', 'X', проверяется
* в таком порядке. По умолчанию значение опции 'avatar_rating'.
* @type string $scheme Схема URL для использования. Смотрите set_url_scheme() для допустимых значений.
* По умолчанию null.
* @type array $processed_args Когда функция возвращает значение, оно будет обработанными/очищенными $args
* плюс предположение "found_avatar". Передается по ссылке. По умолчанию null.
* }
* @return false|string URL найденного аватара или false, если аватар не найден.
*/
function get_avatar_url( $id_or_email, $args = null ) {
$args = get_avatar_data( $id_or_email, $args );
return $args['url'];
}
где get_avatar_data()
также является новой вспомогательной функцией.
Она содержит этот фрагмент кода:
... ОБРЕЗАНО ...
/**
* Фильтр для раннего получения URL аватара.
*
* Передача не-null значения в элементе 'url' возвращаемого массива
* эффективно прервет выполнение get_avatar_data(), передав значение через
* фильтр {@see 'get_avatar_data'} и завершив выполнение досрочно.
*
* @since 4.2.0
*
* @param array $args Аргументы, переданные в get_avatar_data(), после обработки.
* @param int|object|string $id_or_email ID пользователя, email или объект комментария.
*/
$args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email );
if ( isset( $args['url'] ) && ! is_null( $args['url'] ) ) {
/** Этот фильтр описан в wp-includes/link-template.php */
return apply_filters( 'get_avatar_data', $args, $id_or_email );
}
... ОБРЕЗАНО ...
где мы видим, что когда параметр url
установлен, доступны фильтры pre_get_avatar_data
и get_avatar_data
.
После недавнего обновления до версии 4.2 у меня возникла проблема с темой, которая определяла свою собственную версию get_avatar_url()
, без префиксов имени функции или проверки function_exists()
. Так что это пример того, почему это важно ;-)

Вы можете использовать фильтр get_avatar
для получения всех данных аватара, включая URL внутри разметки. Насколько я знаю, WordPress не имеет функции для возврата только 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.
/**
* Получение аватара пользователя по ID или email.
*
* @since 2.5
* @param int|string|object $id_or_email ID пользователя, email или объект комментария
* @param int $size Размер изображения аватара
* @param string $default URL изображения по умолчанию, если аватар недоступен
* @param string $alt Альтернативный текст для изображения. По умолчанию пустая строка
* @param boolean $url Если true, вернет только URL изображения без разметки
* @return string Тег <img> с аватаром пользователя
*/
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) ) {
// Нет аватара для пингбэков или трекбэков
$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&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 .= '&d=' . urlencode( $default );
$rating = get_option('avatar_rating');
if ( !empty( $rating ) )
$out .= "&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;
}
Используйте эту функцию в своем коде с email авторов, и вы получите URL их изображений.

Я считаю, что это улучшенная версия ответа aalaap:
// В вашем шаблоне ...
$avatar_url = get_avatar_url ( get_the_author_meta('ID'), $size = '50' );
// Получаем URL src из тега <img> аватара (добавить в 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] );
}

get_user_meta($userId, 'simple_local_avatar');
Плагин Simple Local Avatars использует метаполя для хранения аватара, поэтому вы можете просто получить значение(я), вызвав функцию get_user_meta
и указав поле 'simple_local_avatar'. В результате вы получите массив следующего вида:
array
(
[full] => 'http://...',
[96] => 'http://...',
[32] => 'http://...'
)

Метод alaap больше не работает в WordPress 4.2
Я нашел решение. Вот оно, и оно хорошо работает:
function my_gravatar_url() { // Получаем email пользователя
$user_email = get_the_author_meta( 'user_email' );
// Конвертируем email в md5 хеш и устанавливаем размер изображения 80 px
$user_gravatar_url = 'http://www.gravatar.com/avatar/' . md5($user_email) . '?s=80';
echo $user_gravatar_url; }
В шаблоне просто используйте:
<?php my_gravatar_url() ?>
Примечание: должен использоваться внутри цикла (loop).

Несколько часов назад я тоже задавался вопросом, как это сделать. Но вскоре я нашел решение и создал плагин. Проверьте, подходит ли вам функция get_avatar_url($user_id, $size) или нет. Спасибо.
Код плагина:
/*
Plugin Name: Get Avatar URL
Plugin URI: https://github.com/faizan1041/get-avatar-url
Description: get_avatar возвращает изображение, get_avatar_url вернет вам URL изображения.
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 ]' );
