Как получить идентификатор профиля пользователя при загрузке изображения через медиапочтовик на странице профиля

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

У меня есть плагин, который позволяет пользователю загрузить изображение в профиль пользователя на стороне сервера. Теперь я хочу получить идентификатор пользователя в загрузчике, чтобы изменить имя файла загружаемого изображения.

На странице редактирования профиля пользователя я получаю идентификатор через 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;
}

Объяснение кода

  1. Фильтр wp_handle_upload_prefilter: Вы добавляете фильтр к этому хуку, который предоставляет возможность изменять файл перед его обработкой. В вашем случае, 10 указывает приоритет, а 2 – количество передаваемых аргументов (файл и userid).

  2. Получение идентификатора пользователя: В функции my_pre_upload мы проверяем, передан ли userid. Если нет, то используется get_current_user_id(), чтобы получить ID текущего пользователя.

  3. Изменение имени файла: Используя 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);
        });
    }

    // Остальная часть вашего кода для отображения страницы
}

Заключение

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

Следование этим рекомендациям обеспечит плавную интеграцию процесса загрузки изображений в вашу систему, улучшая пользовательский опыт и облегчая администрирование.

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

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