Вопрос или проблема
Я использую 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 для аватаров, поэтому для корректного отображения пользовательских аватаров без плагинов может потребоваться дополнительная настройка темы или создание функции для скобок.
Пример
В вашем коде использованы функции для загрузки изображения в медиа-библиотеку и обновления метаданных пользователя. Давайте разберем этапы подробно:
-
Загрузка изображения в медиа-библиотеку: Используется функция
media_handle_sideload
, которая загружает изображение в медиа-библиотеку и возвращает ID загруженного файла или объектWP_Error
в случае ошибки. -
Обновление метаданных пользователя: Здесь применяется функция
update_user_meta
, чтобы сохранить ID медиа-файла в пользовательских метаданных. Это дает возможность связать изображение с конкретным пользователем. -
Настройка отображения аватара: Чтобы заставить 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;
}
Завершение и проверка
-
Проверка ошибок: Убедитесь, что ошибок загрузки файла нет в логах. Может быть полезно начать с очистки существующего кэша и проверки ролей пользователей.
-
Тестирование: Создайте тестовую учетную запись и загрузите аватар для убеждения в том, что изменения работают корректно.
-
Настройка темы: Некоторые темы могут игнорировать пользовательские фильтры аватаров. В этом случае потребуется ручное вмешательство в шаблоны темы, где выводятся аватары пользователей.
При соблюдении всех вышеуказанных правил и корректной настройке кода, ваш сайт будет успешно устанавливать загруженное изображение как аватар пользователя.