Вопрос или проблема
Я использую 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. Исходя из предоставленного кода и проблематики, хочу предложить не только решение, но и объяснить, почему ваше текущее решение может не работать.
Теория
Ваша задача состоит в том, чтобы:
- Загружать файл изображения через форму Gravity Forms.
- Помещать загруженный файл в Медиа библиотеку WordPress.
- Назначать это изображение как аватар пользователя.
На данный момент основная проблема, вероятно, заключается в том, что WordPress по умолчанию не использует пользовательские метаданные для аватаров. Он использует Gravatar, и чтобы использовать локальные аватары, необходимо немного изменить стандартный подход.
Пример
Давайте разберем текущий код для решения вашей задачи:
-
Получение файла и идентификатора пользователя:
Вы правильно используете функциюrgar()
для получения URL загруженного файла и идентификатора пользователя. -
Добавление файла в Медиа библиотеку:
Вы корректно создаете массив с параметрами файла и используетеmedia_handle_sideload()
для добавления в медиатеку. -
Обновление пользовательского аватара:
Ошибка здесь заключается в том, что обновление метаданных пользователя ‘custom_avatar’ не изменит отображаемый аватар. Для применения аватара, необходимо использовать фильтр WordPressget_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;
}
Объяснение
-
Получение данных: Всё начинается с получения URL загруженного файла и ID пользователя после отправки формы.
-
Сохранение изображения: Файл загружается в медиатеку, и всем временным данным, если возникли ошибки, присваивается
error
. -
Сохранение метаданных: ID вложения сохраняется в метаданных пользователя.
-
Использование фильтра
get_avatar
: С помощью этого фильтра мы перехватываем стандартное поведение WordPress и заменяем аватар пользователя на тот, что загружен в медиа библиотеку. Мы берём ID вложения, преобразуем его в URL-адрес изображения и возвращаем как аватар.
Такой подход позволяет обойти ограничения дефолтных настроек WordPress и должным образом использовать загруженные изображения как аватары пользователей. Убедитесь, что функция файловой системы download_url()
возвращает успешный результат, так как это часто является причиной скрытых ошибок. Плюс, важное значение имеет правильная проверка структуры и доступности переменных в PHP для избегания ошибок.