Как получить URL аватара вместо HTML IMG тега при использовании get_avatar?

24 июл. 2012 г., 11:05:13
Просмотры: 54.9K
Голосов: 28

Я использую плагин Simple Local Avatars, который позволяет загружать изображения авторов, которые хранятся локально на моем сервере (без Gravatar). Плагин работает нормально, и get_avatar возвращает локальный аватар.

Однако мне нужно использовать этот аватар разными способами и в разных местах, и для этого мне нужен URL изображения локального аватара вместо целого HTML-тега. Я мог бы написать функцию-обертку для get_avatar, которая использует RegEx или SimpleXML для выбора и возврата только URL, но я хотел узнать, существует ли уже готовый способ сделать это.

0
Все ответы на вопрос 8
4
25

Приведенный выше ответ кажется исчерпывающим, но я просто написал обертку-функцию и пошел дальше. Вот она, если вам нужна (поместите это в 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, поэтому не будет слишком ресурсозатратным.

25 июл. 2012 г. 14:35:04
Комментарии

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

spdaly spdaly
17 сент. 2014 г. 15:43:10

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

Sagive Sagive
21 дек. 2014 г. 05:04:47

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

user9447 user9447
1 авг. 2016 г. 20:20:53

@Darth_Vader Я не возвращался к этому с момента публикации вопроса, так что теперь не уверен, является ли это идеальным способом решения. Думаю, новый ответ про версию 4.2+ лучше.

aalaap aalaap
2 авг. 2016 г. 07:02:15
0
25

Хорошие новости для 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(). Так что это пример того, почему это важно ;-)

14 мая 2015 г. 02:23:21
0

Вы можете использовать фильтр 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&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;
}

Используйте эту функцию в своем коде с email авторов, и вы получите URL их изображений.

24 июл. 2012 г. 11:31:26
0

Я считаю, что это улучшенная версия ответа 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] );
}
25 мар. 2014 г. 21:36:52
0
get_user_meta($userId, 'simple_local_avatar');

Плагин Simple Local Avatars использует метаполя для хранения аватара, поэтому вы можете просто получить значение(я), вызвав функцию get_user_meta и указав поле 'simple_local_avatar'. В результате вы получите массив следующего вида:

array
(
  [full] => 'http://...',
  [96] => 'http://...',
  [32] => 'http://...'
)
15 апр. 2015 г. 23:13:40
0

Метод 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).

25 апр. 2015 г. 06:57:39
0

Когда аватар загружен локально, WordPress возвращает тег img с атрибутом src в двойных кавычках, поэтому я обнаружил, что этот шаблон работает лучше:

preg_match("/src=['\"](.*?)['\"]/i", $get_avatar, $matches);
27 нояб. 2014 г. 08:37:01
0

Несколько часов назад я тоже задавался вопросом, как это сделать. Но вскоре я нашел решение и создал плагин. Проверьте, подходит ли вам функция 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 ]' );
14 дек. 2014 г. 21:41:40