Как программно выполнить загрузку аватара пользователя wp?

Ссылка скопирована
1 ответ

Получаю base64 с фронта и хочу записать картинку в аватар пользователя, на просторах интернета не нашёл дельного кода по его установке

Дополнительно:

Как программно выполнить загрузку аватара пользователя wp?

Камил @Lakika Sicario Чтобы программно установить аватар пользователя в WordPress, вам придется воспользоваться функцией wp_update_user(), которая позволяет обновить данные пользователя, и функцией get_avatar_url(), которая возвращает URL аватара пользователя.

Вам также потребуется плагин, такой как WP User Avatar, чтобы загружать и управлять аватарами пользователей, так как встроенные функции WordPress не поддерживают загрузку аватаров напрямую.

Если вы используете WP User Avatar, вы можете использовать функцию wp_handle_upload() для загрузки изображения, а затем функцию wp_insert_attachment() для вставки изображения как вложения в базу данных WordPress. После этого вы можете установить это вложение как аватар пользователя с помощью функции update_user_meta().

  • // Декодируйте base64 в файл $data = base64_decode($base64_data); $file = '/path/to/uploads/' . $username . '.jpg'; file_put_contents($file, $data);  // Подготовьте файл для загрузки $file_array = array(     'name'     => basename($file),     'tmp_name' => $file, );  // Загрузите файл в WordPress $uploaded_file = wp_handle_upload($file_array, array('test_form' => false)); if($uploaded_file && !isset($uploaded_file['error'])) {     // Вставьте файл как вложение     $wp_upload_dir = wp_upload_dir();     $attachment = array(         'guid'           => $wp_upload_dir['url'] . '/' . basename($file),         'post_mime_type' => $uploaded_file['type'],         'post_title'     => preg_replace('/.[^.]+$/', '', basename($file)),         'post_content'   => '',         'post_status'    => 'inherit'     );     $attach_id = wp_insert_attachment($attachment, $file);      // Установите это вложение как аватар пользователя     update_user_meta($user_id, 'wp_user_avatar', $attach_id); }

    // Декодируйте base64 в файл $data = base64_decode($base64_data); $file = '/path/to/uploads/' . $username . '.jpg'; file_put_contents($file, $data); // Подготовьте файл для загрузки $file_array = array( 'name' => basename($file), 'tmp_name' => $file, ); // Загрузите файл в WordPress $uploaded_file = wp_handle_upload($file_array, array('test_form' => false)); if($uploaded_file && !isset($uploaded_file['error'])) { // Вставьте файл как вложение $wp_upload_dir = wp_upload_dir(); $attachment = array( 'guid' => $wp_upload_dir['url'] . '/' . basename($file), 'post_mime_type' => $uploaded_file['type'], 'post_title' => preg_replace('/.[^.]+$/', '', basename($file)), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment($attachment, $file); // Установите это вложение как аватар пользователя update_user_meta($user_id, 'wp_user_avatar', $attach_id); }

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

В ядре WordPress нет штатного "локального аватара" пользователя: по умолчанию используется Gravatar по email. Поэтому программная загрузка аватара состоит из двух частей: сохранить изображение в медиабиблиотеку и договориться, как именно тема/плагин будет использовать этот attachment как аватар.

Если у вас есть плагин локальных аватаров, например Simple Local Avatars, он хранит ID вложения в user meta. Если плагина нет, можно сохранить свою мету и переопределить get_avatar_url.

Пример сохранения base64 в медиабиблиотеку:

function site_save_user_avatar_from_base64($user_id, $base64) {
    if (!current_user_can('edit_user', $user_id)) {
        return new WP_Error('forbidden', 'No permission');
    }
 
    if (preg_match('/^data:image/(w+);base64,/', $base64, $matches)) {
        $extension = strtolower($matches[1]);
        $base64 = substr($base64, strpos($base64, ',') + 1);
    } else {
        $extension = 'jpg';
    }
 
    $binary = base64_decode($base64);
    if (!$binary) {
        return new WP_Error('bad_image', 'Invalid image');
    }
 
    $upload = wp_upload_bits('avatar-' . $user_id . '.' . $extension, null, $binary);
    if (!empty($upload['error'])) {
        return new WP_Error('upload_error', $upload['error']);
    }
 
    $filetype = wp_check_filetype($upload['file']);
    $attachment_id = wp_insert_attachment([
        'post_mime_type' => $filetype['type'],
        'post_title' => 'User avatar ' . $user_id,
        'post_status' => 'inherit',
    ], $upload['file']);
 
    require_once ABSPATH . 'wp-admin/includes/image.php';
    wp_update_attachment_metadata($attachment_id, wp_generate_attachment_metadata($attachment_id, $upload['file']));
 
    update_user_meta($user_id, 'site_local_avatar_id', $attachment_id);
 
    return $attachment_id;
}

function site_save_user_avatar_from_base64($user_id, $base64) { if (!current_user_can('edit_user', $user_id)) { return new WP_Error('forbidden', 'No permission'); } if (preg_match('/^data:image/(w+);base64,/', $base64, $matches)) { $extension = strtolower($matches[1]); $base64 = substr($base64, strpos($base64, ',') + 1); } else { $extension = 'jpg'; } $binary = base64_decode($base64); if (!$binary) { return new WP_Error('bad_image', 'Invalid image'); } $upload = wp_upload_bits('avatar-' . $user_id . '.' . $extension, null, $binary); if (!empty($upload['error'])) { return new WP_Error('upload_error', $upload['error']); } $filetype = wp_check_filetype($upload['file']); $attachment_id = wp_insert_attachment([ 'post_mime_type' => $filetype['type'], 'post_title' => 'User avatar ' . $user_id, 'post_status' => 'inherit', ], $upload['file']); require_once ABSPATH . 'wp-admin/includes/image.php'; wp_update_attachment_metadata($attachment_id, wp_generate_attachment_metadata($attachment_id, $upload['file'])); update_user_meta($user_id, 'site_local_avatar_id', $attachment_id); return $attachment_id; }

Дальше можно подставить этот URL как аватар:

add_filter('get_avatar_url', function ($url, $id_or_email) {
    $user = false;
 
    if (is_numeric($id_or_email)) {
        $user = get_user_by('id', (int) $id_or_email);
    } elseif ($id_or_email instanceof WP_User) {
        $user = $id_or_email;
    }
 
    if (!$user) {
        return $url;
    }
 
    $avatar_id = (int) get_user_meta($user->ID, 'site_local_avatar_id', true);
    $local_url = $avatar_id ? wp_get_attachment_image_url($avatar_id, 'thumbnail') : '';
 
    return $local_url ?: $url;
}, 10, 2);

add_filter('get_avatar_url', function ($url, $id_or_email) { $user = false; if (is_numeric($id_or_email)) { $user = get_user_by('id', (int) $id_or_email); } elseif ($id_or_email instanceof WP_User) { $user = $id_or_email; } if (!$user) { return $url; } $avatar_id = (int) get_user_meta($user->ID, 'site_local_avatar_id', true); $local_url = $avatar_id ? wp_get_attachment_image_url($avatar_id, 'thumbnail') : ''; return $local_url ?: $url; }, 10, 2);

Обязательно валидируйте тип файла, размер изображения и права пользователя. Base64 с фронта нельзя сохранять без проверок.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно