Как заменить Gravatar на загруженные изображения?

23 нояб. 2015 г., 07:14:35
Просмотры: 22K
Голосов: 5

Я добавил функционал загрузки изображения профиля, следуя ЭТОМУ руководству.

Я не могу найти онлайн-руководство или документацию о хуках WordPress.. Как заменить изображения профиля Gravatar (в секции комментариев) на пользовательские загруженные изображения?

Я не хочу заставлять моих пользователей регистрироваться в Gravatar, чтобы изменить изображение профиля на моем сайте.

6
Комментарии

Вы рассматривали возможность использования Buddypress?

Dan Alexander Dan Alexander
23 нояб. 2015 г. 08:38:53

так вы предпочитаете потенциально заставлять их загружать изображение на каждом сайте? Я не фанат gravatar, но это как раз та (и единственная) проблема, которую он решает.

Mark Kaplun Mark Kaplun
23 нояб. 2015 г. 10:37:23

@MarkKaplun используя фильтр get_avatar, пользователи всё ещё могут использовать gravatar. Смотрите мой ответ. Я обычно не рекомендую сторонние плагины, тем более если они давно не обновлялись, но local simple avatar хорошо справляется со своей задачей и также добавляет рейтинги аудитории для локальных аватаров, предоставляя полное решение. Это может быть отличной отправной точкой для вашего собственного плагина.

cybmeta cybmeta
23 нояб. 2015 г. 12:05:48

@cybmeta, конечно, это возможно и полезно, я просто ставлю под сомнение логику этого в контексте вопроса. Вероятно, проще получить изображение на Gravatar, чем то, что @Noob будет использовать в своей реализации. Если причина не связана с приватностью или модерацией, то я не вижу, как локальное решение может быть лучше Gravatar. На мой взгляд, сегодня имеет больше смысла позволить пользователю использовать его аватар из Facebook, Twitter или Google, если ваша главная забота — это удобство пользователя.

Mark Kaplun Mark Kaplun
23 нояб. 2015 г. 12:19:12

Никто не говорил, что это лучше ;). Лично мне нравится идея не заставлять пользователей использовать сторонние сервисы, будь то Gravatar, Facebook или любой другой, если они хотят получить полноценный опыт на вашем сайте. Конечно, использование популярных социальных сетей может быть выгодным для вашего сайта, но также важно предложить полноценный опыт пользователям. Это не лучше и не хуже, просто выбор, который мы можем сделать как владельцы сайта. И контекст вопроса заключался не в том, чтобы загружать локальные аватары, а наоборот — не принуждать к использованию Gravatar (это можно расширить до отказа от принуждения к использованию сторонних сервисов).

cybmeta cybmeta
23 нояб. 2015 г. 12:23:56

Спасибо, ребята, за ваши ответы и обсуждения! Я их обработаю и попробую в ближайшее время. У меня есть причины не использовать Gravatar.

N00b N00b
23 нояб. 2015 г. 23:14:49
Показать остальные 1 комментариев
Все ответы на вопрос 4
2

Предполагая, что у пользователя сохранен аватар в виде ID вложения, хранящегося в мета-данных пользователя в поле field_with_custom_avatar_id, вы можете сделать следующее, чтобы отобразить это вложение, если значение сохранено:

add_filter( 'get_avatar', 'slug_get_avatar', 10, 5 );
function slug_get_avatar( $avatar, $id_or_email, $size, $default, $alt ) {

    // Если передан email, попробуем найти ID пользователя
    if( ! is_numeric( $id_or_email ) && is_email( $id_or_email ) ){
        $user  =  get_user_by( 'email', $id_or_email );
        if( $user ){
            $id_or_email = $user->ID;
        }
    }

    // Если это не ID пользователя, возвращаем стандартный аватар
    if( ! is_numeric( $id_or_email ) ){
        return $avatar;
    }

    // Находим ID вложения, сохраненного в мета-данных пользователя
    $saved = get_user_meta( $id_or_email, 'field_with_custom_avatar_id', true );
    if( 0 < absint( $saved ) ) {
        // Возвращаем сохраненное изображение
        return wp_get_attachment_image( $saved, [ $size, $size ], false, ['alt' => $alt] );
    }

    // Возвращаем стандартный аватар
    return $avatar;

}

Или, если аватар сохранен как URL изображения в поле мета-данных пользователя field_with_custom_avatar:

add_filter( 'get_avatar', 'slug_get_avatar', 10, 5 );
function slug_get_avatar( $avatar, $id_or_email, $size, $default, $alt ) {

    // Если передан email, попробуем найти ID пользователя
    if( ! is_numeric( $id_or_email ) && is_email( $id_or_email ) ){
        $user  =  get_user_by( 'email', $id_or_email );
        if( $user ){
            $id_or_email = $user->ID;
        }
    }

    // Если это не ID пользователя, возвращаем стандартный аватар
    if( ! is_numeric( $id_or_email ) ){
        return $avatar;
    }

    // Находим URL сохраненного аватара в мета-данных пользователя
    $saved = get_user_meta( $id_or_email, 'field_with_custom_avatar', true );
    // Проверяем, является ли значение URL
    if( filter_var( $saved, FILTER_VALIDATE_URL ) ) {
        // Возвращаем сохраненное изображение
        return sprintf( '<img src="%" alt="%" />', esc_url( $saved ), esc_attr( $alt ) );
    }

    // Возвращаем стандартный аватар
    return $avatar;

}
16 нояб. 2017 г. 17:14:25
Комментарии

... этот злополучный $id_or_email ;-) Надеюсь, с предлагаемыми изменениями в #41544 мы сможем упростить работу с ним.

birgire birgire
16 нояб. 2017 г. 18:47:51

Привет. Я использую ваш сниппет для фильтра get_avatar_url. Он работает везде, кроме comment_list. Выдаёт ошибку strlen() expects parameter 1 to be string, object given in /home/my_theme/public_html/wp-includes/formatting.php on line 2891

wpdev wpdev
25 дек. 2018 г. 15:34:04
0

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

add_filter( 'get_avatar', 'cyb_get_avatar', 10, 5 );
function cyb_get_avatar( $avatar = '', $id_or_email, $size = 96, $default = '', $alt = '' ) {

    // Замените $avatar на свой собственный элемент изображения, например
    // $avatar = "<img alt='$alt' src='your_new_avatar_url' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"

    return $avatar;

}

Обратите внимание, что при использовании этого фильтра вы всё ещё можете разрешить пользователям использовать Gravatar. Вы можете проверить, загрузил ли пользователь аватар на ваш сайт, и если да — использовать его, а если нет — вернуть стандартный $avatar, который будет взят из Gravatar, если у пользователя он есть. (Если вы добавите в вопрос код, который используете для хранения аватаров пользователей, я смогу предоставить точный рабочий код):

add_filter( 'get_avatar', 'cyb_get_avatar', 10, 5 );
function cyb_get_avatar( $avatar = '', $id_or_email, $size = 96, $default = '', $alt = '' ) {

    if( "user_has_uploaded_a_local_avatar" ) {
       // Замените $avatar на свой собственный элемент изображения, например
       // $avatar = "<img alt='$alt' src='your_new_avatar_url' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"
    }

    // если пользователь не загрузил локальный аватар,
    // будет использован стандартный аватар, который может быть из Gravatar
    return $avatar;

}
23 нояб. 2015 г. 11:45:57
2

Это комментарий по типу "у меня тоже самое", но с решением :)

Когда я включил раздел комментариев, то получил ошибку от is_email($id_or_email).

Вот сама ошибка:

strlen() expects parameter 1 to be string, object given in /home/my_theme/public_html/wp-includes/formatting.php on line 2891

Ошибка возникает, потому что $id_or_email содержит объект, а не строку.

Я нашел обходное решение, извлекая строку email из объекта $id_or_email->comment_author_email

Так что я заменил $id_or_email на $id_or_email->comment_author_email, и теперь я получаю правильную аватарку для комментариев без ошибок.

8 янв. 2019 г. 20:52:49
Комментарии

Вам стоит отредактировать ваш ответ для большей ясности. Когда я начал читать, сначала показалось, что это не ответ, а скорее "у меня та же проблема". Поэтому я почти пометил его как "не ответ". Вы могли бы отредактировать его, чтобы более прямо отвечать на старый вопрос. Старые вопросы часто требуют обновленных ответов, так как код продолжает развиваться, поэтому совершенно нормально добавлять поздние ответы - просто сделайте это намерение понятным ;-) (И добро пожаловать на WPSE)

butlerblog butlerblog
8 янв. 2019 г. 21:50:36

Да, я сначала попытался написать это как комментарий к bilimokur, но мне нужно 50 очков репутации, чтобы оставлять комментарии :( Я отредактирую этот ответ, чтобы уточнить, что это фактически комментарий "у меня та же проблема", но с решением :)

atonus atonus
8 янв. 2019 г. 22:38:26
1
-2

Если вы установили свою собственную или загруженную аватарку и хотите отобразить её на фронтенде, вы можете использовать следующую функцию.

<?php echo get_avatar( $id_or_email, $size, $default, $alt, $args ); ?> 

Если вам нужно заменить граватар на собственную аватарку, вы можете ознакомиться с инструкцией по ссылке: http://www.wpbeginner.com/wp-tutorials/how-to-change-the-default-gravatar-on-wordpress/

23 нояб. 2015 г. 07:53:10
Комментарии

минусую, потому что по сути ответ сводится к "почитайте какой-то внешний ресурс", который может быть полезен на момент написания, но станет недоступен позже. Ответы должны быть максимально самодостаточными.

Mark Kaplun Mark Kaplun
16 нояб. 2017 г. 17:46:47