Вопрос или проблема
У меня есть плагин, который позволяет пользователю загрузить изображение в профиль пользователя на стороне сервера. Теперь я хочу получить идентификатор пользователя в загрузчике, чтобы изменить имя файла загружаемого изображения.
На странице редактирования профиля пользователя я получаю идентификатор через global $profileuser
. Но когда я обращаюсь к нему в функции, которую я добавил как фильтр к wp_handle_upload
, $profileuser пуст.
Есть идеи, как получить профиль пользователя (а не вошедшего в систему) в этом случае?
Это мой код:
add_filter('wp_handle_upload_prefilter', 'my_pre_upload', 2);
function my_pre_upload($file){
// получить текущего пользователя
global $profileuser;
$myAuthorImg = get_userdata( $profileuser->ID );
$myAuthorImg = 'author-' . $myAuthorImg . '.jpg";
$file['name'] = $myAuthorImg
return $file;
}
Вам нужно передать $profileuser->ID в качестве второго аргумента, когда вы вызываете свою функцию, и определить ее соответственно:
add_filter('wp_handle_upload_prefilter', 'my_pre_upload', 2, 2);
// (3-й параметр - приоритет, 4-й - количество аргументов)
// и передайте $userid в качестве аргумента вашей функции
function my_pre_upload($file, $userid = false){
// если пользователь не указан, получить $current_user
$userid = $userid ?: get_current_user_id();
$user = get_userdata( $userid );
$myAuthorImg = 'author-' . $user->ID . '.jpg";
$file['name'] = $myAuthorImg
return $file;
}
Ответ или решение
Как получить идентификатор пользователя при загрузке изображения через медиа-загрузчик на странице профиля
При разработке плагина для WordPress, который позволяет пользователям загружать изображения в профили, может возникнуть необходимость изменить имя файла загружаемого изображения, основываясь на идентификаторе пользователя. В этой статье мы рассмотрим, как правильно получить идентификатор пользователя на странице редактирования профиля и использовать его в функции обработки загрузки.
Проблема
На странице редактирования профиля вы можете использовать переменную global $profileuser
, чтобы получить идентификатор нужного пользователя, однако, когда вы пытаетесь использовать её в функции, добавленной в фильтр wp_handle_upload
, переменная оказывается пустой. Это происходит потому, что во время обработки загрузки global $profileuser
недоступен.
Решение
Основная задача заключается в том, чтобы передать идентификатор пользователя в функцию, которая обрабатывает загрузку. Ниже представлена модифицированная версия вашего кода, которая позволяет сделать это:
add_filter('wp_handle_upload_prefilter', 'my_pre_upload', 10, 2);
function my_pre_upload($file, $userid = false) {
// Получаем текущего пользователя, если $userid не указан
$userid = $userid ?: get_current_user_id();
// Получаем данные пользователя
$user = get_userdata($userid);
// Изменяем имя файла
$myAuthorImg = 'author-' . $user->ID . '.jpg';
$file['name'] = $myAuthorImg;
return $file;
}
Объяснение кода
-
Фильтр
wp_handle_upload_prefilter
: Вы добавляете фильтр к этому хуку, который предоставляет возможность изменять файл перед его обработкой. В вашем случае,10
указывает приоритет, а2
– количество передаваемых аргументов (файл иuserid
). -
Получение идентификатора пользователя: В функции
my_pre_upload
мы проверяем, передан лиuserid
. Если нет, то используетсяget_current_user_id()
, чтобы получить ID текущего пользователя. -
Изменение имени файла: Используя ID пользователя, мы создаем новое имя файла
author-{userid}.jpg
и присваиваем его переменной$file['name']
.
Вывод с использованием фильтра
Теперь, чтобы корректно передать идентификатор пользователя, вам потребуется внести изменения в ту часть кода, где вызывается ваш фильтр. Например, передавайте userid
при обработке форм:
function my_custom_profile_page() {
global $profileuser;
// Допустим, у вас есть функция для обработки формы
if ($_FILES) {
// Передайте ID пользователя
add_filter('wp_handle_upload_prefilter', function($file) use ($profileuser) {
return my_pre_upload($file, $profileuser->ID);
});
}
// Остальная часть вашего кода для отображения страницы
}
Заключение
Таким образом, для доступа к идентификатору пользователя в процессе загрузки изображения вы можете извлечь его через глобальную переменную, а затем передать этот идентификатор в вашу функцию обработки загружаемых файлов. Это не только поможет вам изменить имя файла, но и упростит последующие манипуляции с данными пользователя.
Следование этим рекомендациям обеспечит плавную интеграцию процесса загрузки изображений в вашу систему, улучшая пользовательский опыт и облегчая администрирование.