Вопрос или проблема
у меня есть мета-ключ пользователя с именем “аватар”;
Это значение содержит URL изображения, которое загружает пользователь.
Как я могу установить это мета-значение в качестве аватара пользователя?
Я использую этот код, и он не работает
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, 'avatar', true );
//проверить, является ли это URL
if( filter_var( $saved, FILTER_VALIDATE_URL ) ) {
//возвращает сохраненное изображение
return sprintf( '<img src="%" alt="%" />', esc_url( $saved ), esc_attr( $alt ) );
}
//вернуть обычное изображение
return $avatar;
}
<?php
$id = get_current_user_id(); // это для текущего пользователя, для другого пользователя просто измените эту переменную на соответствующий ID пользователя
$link = get_user_meta( $id, 'avatar', true ); ?>
<img src="<?php echo $link ?>" alt="">
Это ваш ответ, но если вы хотите понять его, просто продолжайте читать!..
(только после написания всего ниже я увидел, что ваш meta_key имел имя “avatar”, в любом случае…)
Это 10 строк из моей таблицы wp_usermeta;
mysql> select * from wp_usermeta limit 5, 10;
+----------+---------+-----------------------+---------------------------------+
| umeta_id | user_id | meta_key | meta_value |
+----------+---------+-----------------------+---------------------------------+
| 6 | 1 | syntax_highlighting | true |
| 7 | 1 | comment_shortcuts | false |
| 8 | 1 | admin_color | light |
| 9 | 1 | use_ssl | 0 |
| 10 | 1 | show_admin_bar_front | false |
| 11 | 1 | locale | |
| 12 | 1 | wp_capabilities | a:1:{s:13:"administrator";b:1;} |
| 13 | 1 | wp_user_level | 10 |
| 14 | 1 | dismissed_wp_pointers | theme_editor_notice |
| 15 | 1 | show_welcome_panel | 0 |
+----------+---------+-----------------------+---------------------------------+
10 зарегистрированных строк (0.00 сек.)
Если я хочу свой admin_color (3-я строка), я могу запустить этот код:
$link = get_user_meta( 1, 'admin_color', true );
echo '<p>'. $link . '</p>';
и это выведет “light”, meta_value, в котором будет ваш путь к ссылке.
Первый аргумент — это user_id, второй — meta_key, и третий — указывает, хотите ли вы получить только один результат или больше, по умолчанию false, это означает только один результат, в этом случае true означает столько, сколько они есть в таблице.
Это значит, что вы можете использовать эту функцию, но вам нужно знать значение meta_key, чтобы получить meta_value, потому что у user id много meta_keys, и meta_key уникален. чтобы узнать meta_key, вы можете использовать этот код, проанализировать его, а затем изменить user_id на ваш user_id и meta_key на ваш мета ключ, и вы получите ваш путь к ссылке.
$id = get_current_user_id();
echo 'Мой ID '.$id;
$link = get_user_meta( $id, '', true );
echo '<pre>';
print_r($link);
теперь, если он там, просто используйте первый код с правильными аргументами
<?php
$id = get_current_user_id();
$link = get_user_meta( $id, 'your_meta_key_target', true ); ?>
<img src="<?php echo $link ?>" alt="">
Проблема в вашем коде в функции sprintf
и условных
операторах
В функции sprintf исправлен заполнитель для источника изображения на %s
вместо %
.
Добавлены дополнительные атрибуты к тегу изображения class, width, height
, чтобы соответствовать стандартному выводу аватаров wp
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, 'avatar', true );
// Проверить, является ли это URL
if ( filter_var( $saved, FILTER_VALIDATE_URL ) ) {
// Вернуть сохраненное изображение
return sprintf( '<img src="%s" alt="%s" class="avatar avatar-%d" width="%d" height="%d">', esc_url( $saved ), esc_attr( $alt ), $size, $size, $size );
}
// Вернуть стандартный аватар
return $avatar;
}
Ответ или решение
Чтобы установить пользовательский метаданный ключ как аватар, учитывая ваше описание задачи, необходимо внести некоторые изменения в ваш исходный код. Ваша цель состоит в том, чтобы использованный аватар соответствовал URL, хранящемуся в метаданных пользователя с ключом avatar
. Проанализируем ваш код и предложим исправления.
Текущий Контекст
У вас есть метаданный ключ avatar
, который содержит URL загруженного пользователем изображения. Вы хотите, чтобы это изображение использовалось как пользовательский аватар на сайте.
Типичные Ошибки и Исправления
- Placeholder в функцию sprintf:
- В вашей текущей функции sprintf используется некорректный placeholder
%
для замены строки. Для подстановки URL вы должны использовать%s
. Например:return sprintf('<img src="%s" alt="%s" />', esc_url($saved), esc_attr($alt));
- В вашей текущей функции sprintf используется некорректный placeholder
- Добавление атрибутов к тегу img:
- Чтобы изображение соответствовало стандартам WordPress, добавьте атрибуты class, width и height.
- Логика в условиях:
- Убедитесь, что сначала выполнена проверка на идентификатор пользователя и, в случае получения электронной почты, она преобразуется в 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;
}
// Поиск сохраненного URL аватара в метаданных пользователя.
$saved = get_user_meta($id_or_email, 'avatar', true);
// Проверка, является ли это URL-адресом.
if (filter_var($saved, FILTER_VALIDATE_URL)) {
// Возвращаем сохраненное изображение.
return sprintf('<img src="%s" alt="%s" class="avatar avatar-%d" width="%d" height="%d" />', esc_url($saved), esc_attr($alt), $size, $size, $size);
}
// Возвращаем стандартный аватар.
return $avatar;
}
Дополнительные Рекомендации
-
SEO и Оптимизация Производительности:
- Убедитесь, что ваши URL к изображениям быстрые для загрузки. Используйте сжатие изображений и CDN, если это возможно.
-
Проверка Пользовательского Ввода:
- Validate and sanitize all metadata input to prevent security vulnerabilities such as XSS attacks.
-
Регулярное Обновление:
- Регулярно проверяйте, что ваш код и версии плагинов совместимы с актуальной версией WordPress.
Эти шаги помогут не только исправить текущие ошибки, но и создать более гибкий, безопасный и производительный продукт.