установить ключ пользовательских метаданных как аватар

Вопрос или проблема

у меня есть мета-ключ пользователя с именем “аватар”;
Это значение содержит 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 загруженного пользователем изображения. Вы хотите, чтобы это изображение использовалось как пользовательский аватар на сайте.

Типичные Ошибки и Исправления

  1. Placeholder в функцию sprintf:
    • В вашей текущей функции sprintf используется некорректный placeholder % для замены строки. Для подстановки URL вы должны использовать %s. Например:
      return sprintf('<img src="%s" alt="%s" />', esc_url($saved), esc_attr($alt));
  2. Добавление атрибутов к тегу img:
    • Чтобы изображение соответствовало стандартам WordPress, добавьте атрибуты class, width и height.
  3. Логика в условиях:
    • Убедитесь, что сначала выполнена проверка на идентификатор пользователя и, в случае получения электронной почты, она преобразуется в 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.

Эти шаги помогут не только исправить текущие ошибки, но и создать более гибкий, безопасный и производительный продукт.

Оцените материал
Добавить комментарий

Капча загружается...