Как установить загруженное изображение в Gravity Forms как аватар пользователя без плагинов?

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

Я использую Gravity Forms, чтобы позволить пользователям регистрироваться на моем сайте WordPress. Я добавил поле загрузки файла (ID: 6), чтобы пользователи могли загружать свой аватар. Я хочу установить это загруженное изображение как аватар пользователя в WordPress без использования дополнительных плагинов.

Вот код, который я попробовал в своем файле functions.php:

add_action('gform_after_submission_1', 'set_user_avatar_from_form', 10, 2);
function set_user_avatar_from_form($entry, $form) {
    $file_url = rgar($entry, '6'); // ID поля для загрузки файла
    $user_id = rgar($entry, 'created_by'); // ID пользователя из формы

    if (empty($file_url) || empty($user_id)) {
        return;
    }

    // Добавление файла в медиатеку
    $file_array = [
        'name' => basename($file_url),
        'tmp_name' => download_url($file_url),
    ];

    if (is_wp_error($file_array['tmp_name'])) {
        return;
    }

    $attachment_id = media_handle_sideload($file_array, 0);

    if (is_wp_error($attachment_id)) {
        @unlink($file_array['tmp_name']);
        return;
    }

    // Установка в качестве аватара пользователя
    update_user_meta($user_id, 'custom_avatar', $attachment_id);
}

Однако аватар не устанавливается. Я проверил файл debug.log, и там нет ошибок. Чего мне не хватает?

Ответ или решение

Для решения задачи установки загруженного изображения в форму Gravity Forms в качестве аватара пользователя WordPress без использования дополнительных плагинов, необходимо пройти через несколько этапов. Рассмотрим их подробно.

Теория

Когда пользователь заполняет форму регистрации на WordPress сайте с помощью Gravity Forms, он может загрузить изображение, которое вы, как администратор, хотите использовать в качестве аватара. Несмотря на то, что WordPress имеет встроенный функционал для работы с медиа-файлами, у него нет нативной поддержки для установки аваторов пользователей без использования сторонних решений.

Основная идея состоит в использовании пользовательских метаданных для хранения информации об аватаре. Для этого можно воспользоваться функцией update_user_meta. Важно помнить, что WordPress по умолчанию использует Gravatar для аватаров, поэтому для корректного отображения пользовательских аватаров без плагинов может потребоваться дополнительная настройка темы или создание функции для скобок.

Пример

В вашем коде использованы функции для загрузки изображения в медиа-библиотеку и обновления метаданных пользователя. Давайте разберем этапы подробно:

  1. Загрузка изображения в медиа-библиотеку: Используется функция media_handle_sideload, которая загружает изображение в медиа-библиотеку и возвращает ID загруженного файла или объект WP_Error в случае ошибки.

  2. Обновление метаданных пользователя: Здесь применяется функция update_user_meta, чтобы сохранить ID медиа-файла в пользовательских метаданных. Это дает возможность связать изображение с конкретным пользователем.

  3. Настройка отображения аватара: Чтобы заставить WordPress использовать загруженное изображение в качестве аватара, необходимо переопределить функцию, отвечающую за вывод аватаров: get_avatar.

Применение

Давайте уточним и дополнительно проработаем ваш код. Первым делом убедимся, что используемая тема поддерживает показ пользовательских аватаров.

add_action('gform_after_submission_1', 'set_user_avatar_from_form', 10, 2);
function set_user_avatar_from_form($entry, $form) {
    $file_url = rgar($entry, '6'); // ID поля загрузки файла
    $user_id = rgar($entry, 'created_by'); // ID пользователя из формы

    if (empty($file_url) || empty($user_id)) {
        return;
    }

    // Загрузка файла в медиа-библиотеку
    $file_array = [
        'name' => basename($file_url),
        'tmp_name' => download_url($file_url), 
    ];

    if (is_wp_error($file_array['tmp_name'])) {
        return;
    }

    $attachment_id = media_handle_sideload($file_array, 0);

    if (is_wp_error($attachment_id)) {
        @unlink($file_array['tmp_name']);
        return;
    }

    // Установка изображения как аватар
    update_user_meta($user_id, 'custom_avatar', $attachment_id);
}

// Переопределение функции get_avatar
add_filter('get_avatar', 'custom_avatar', 10, 5);

function custom_avatar($avatar, $id_or_email, $size, $default, $alt) {
    $user = false;

    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', $id_or_email);
    } elseif (is_object($id_or_email)) {
        if (!empty($id_or_email->user_id)) {
            $user = get_user_by('id', $id_or_email->user_id);
        }
    } else {
        $user = get_user_by('email', $id_or_email);
    }

    if ($user && is_object($user)) {
        $user_id = $user->ID;
        $avatar_id = get_user_meta($user_id, 'custom_avatar', true);

        if ($avatar_id) {
            $avatar = wp_get_attachment_image($avatar_id, [$size, $size], false, ['alt' => $alt]);
        }
    }

    return $avatar;
}

Завершение и проверка

  1. Проверка ошибок: Убедитесь, что ошибок загрузки файла нет в логах. Может быть полезно начать с очистки существующего кэша и проверки ролей пользователей.

  2. Тестирование: Создайте тестовую учетную запись и загрузите аватар для убеждения в том, что изменения работают корректно.

  3. Настройка темы: Некоторые темы могут игнорировать пользовательские фильтры аватаров. В этом случае потребуется ручное вмешательство в шаблоны темы, где выводятся аватары пользователей.

При соблюдении всех вышеуказанных правил и корректной настройке кода, ваш сайт будет успешно устанавливать загруженное изображение как аватар пользователя.

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

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