Как заменить Gravatar на загруженные изображения?
Я добавил функционал загрузки изображения профиля, следуя ЭТОМУ руководству.
Я не могу найти онлайн-руководство или документацию о хуках WordPress.. Как заменить изображения профиля Gravatar (в секции комментариев) на пользовательские загруженные изображения?
Я не хочу заставлять моих пользователей регистрироваться в Gravatar, чтобы изменить изображение профиля на моем сайте.
Предполагая, что у пользователя сохранен аватар в виде 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;
}

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

Хук, который вам нужен, это 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;
}

Это комментарий по типу "у меня тоже самое", но с решением :)
Когда я включил раздел комментариев, то получил ошибку от 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
, и теперь я получаю правильную аватарку для комментариев без ошибок.

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

Если вы установили свою собственную или загруженную аватарку и хотите отобразить её на фронтенде, вы можете использовать следующую функцию.
<?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/
