установить загруженное изображение 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. Исходя из предоставленного кода и проблематики, хочу предложить не только решение, но и объяснить, почему ваше текущее решение может не работать.

Теория

Ваша задача состоит в том, чтобы:

  1. Загружать файл изображения через форму Gravity Forms.
  2. Помещать загруженный файл в Медиа библиотеку WordPress.
  3. Назначать это изображение как аватар пользователя.

На данный момент основная проблема, вероятно, заключается в том, что WordPress по умолчанию не использует пользовательские метаданные для аватаров. Он использует Gravatar, и чтобы использовать локальные аватары, необходимо немного изменить стандартный подход.

Пример

Давайте разберем текущий код для решения вашей задачи:

  1. Получение файла и идентификатора пользователя:
    Вы правильно используете функцию rgar() для получения URL загруженного файла и идентификатора пользователя.

  2. Добавление файла в Медиа библиотеку:
    Вы корректно создаете массив с параметрами файла и используете media_handle_sideload() для добавления в медиатеку.

  3. Обновление пользовательского аватара:
    Ошибка здесь заключается в том, что обновление метаданных пользователя ‘custom_avatar’ не изменит отображаемый аватар. Для применения аватара, необходимо использовать фильтр 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;
    }

    // Сохранение ID вложения как метаданные пользователя
    update_user_meta($user_id, 'custom_avatar', $attachment_id);
}

// Настройка фильтра для отображения пользовательского аватара
add_filter('get_avatar', 'my_custom_avatar', 10, 5);
function my_custom_avatar($avatar, $id_or_email, $size, $default, $alt) {
    if (is_numeric($id_or_email)) {
        $user_id = (int) $id_or_email;
    } elseif (is_object($id_or_email) && !empty($id_or_email->user_id)) {
        $user_id = (int) $id_or_email->user_id;
    } else {
        $user = false;
        if (is_string($id_or_email)) {
            $user = get_user_by('email', $id_or_email);
        }
        $user_id = $user ? $user->ID : 0;
    }

    if ($user_id) {
        $custom_avatar_id = get_user_meta($user_id, 'custom_avatar', true);
        if ($custom_avatar_id) {
            $avatar_url = wp_get_attachment_image_src($custom_avatar_id, 'thumbnail');
            if ($avatar_url) {
                $avatar = "<img alt='" . esc_attr($alt) . "' src='" . esc_url($avatar_url[0]) . "' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
            }
        }
    }

    return $avatar;
}

Объяснение

  1. Получение данных: Всё начинается с получения URL загруженного файла и ID пользователя после отправки формы.

  2. Сохранение изображения: Файл загружается в медиатеку, и всем временным данным, если возникли ошибки, присваивается error.

  3. Сохранение метаданных: ID вложения сохраняется в метаданных пользователя.

  4. Использование фильтра get_avatar: С помощью этого фильтра мы перехватываем стандартное поведение WordPress и заменяем аватар пользователя на тот, что загружен в медиа библиотеку. Мы берём ID вложения, преобразуем его в URL-адрес изображения и возвращаем как аватар.

Такой подход позволяет обойти ограничения дефолтных настроек WordPress и должным образом использовать загруженные изображения как аватары пользователей. Убедитесь, что функция файловой системы download_url() возвращает успешный результат, так как это часто является причиной скрытых ошибок. Плюс, важное значение имеет правильная проверка структуры и доступности переменных в PHP для избегания ошибок.

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

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