Поддержка → Проблемы и решения → Load image by url with auth
Load image by url with auth
-
Добрый всем день!
Пытаюсь загрузить картинку с внешней ссылки, раньше использовал media_sideload_image, но сейчас появилась авторизация и не понятно как тоже самое сделать теперь?
-
Добрый день.
Ну если кратко то:
Получите токен авторизации от внешнего сервиса, где хранится изображение.
И используя этот токен создаёте запрос на загрузку изображения.
Спасибо, через curl я понимаю как это сделать, но тогда встаёт вопрос — как правильно загрузить картинку в библиотеку и привязать к товару? (Woocommerce). Раньше функция media_sideload_image загружала в библиотеку картинку и возвращала ID картинки и я добавлял её в товар.
Можно попробовать использовать как вариант такое:
// URL изображения $image_url = 'https://example.com/image.jpg'; // Авторизационные данные (логин и пароль) $username = 'your_username'; $password = 'your_password'; // Запрос на получение изображения с авторизацией $response = wp_remote_get($image_url, array( 'headers' => array( 'Authorization' => 'Basic ' . base64_encode($username . ':' . $password) ), )); // Получение содержимого изображения $image_data = wp_remote_retrieve_body($response); // Загрузка изображения в библиотеку медиафайлов WordPress $image_id = media_sideload_image($image_data, 0); // Проверка на успешную загрузку изображения if (!is_wp_error($image_id)) { // Привязка изображения к товару update_post_meta($product_id, '_thumbnail_id', $image_id); }
В media_sideload_image надо передавать url, так в описании к функции. В целом я использовал раньше так:
media_sideload_image($image_url, 0, $image_url, 'id');
В теории можно было бы выгрузить и получить временный URL через download_url но он не принимает заголовков для авторизации
Есть вот такая функция https://wp-kama.ru/function/media_handle_sideload но опять же упирается всё в download_url
Я пробовал скачивать через curl и сохранять локально и подсовывать уже локальную ссылку на файл — но ничего не происходит — он как будто не хочет грузить сам с себя =(
Сделал вот каким способом (но работает не совсем правильно):
private function createImageWoocommerce($urlImage, $nameImage) { require_once(ABSPATH . 'wp-admin/includes/media.php'); require_once(ABSPATH . 'wp-admin/includes/file.php'); require_once(ABSPATH . 'wp-admin/includes/image.php'); $path_to_file = $this->loadImage($urlImage, $nameImage); $filetype = wp_check_filetype(basename($path_to_file)); $attachment = array( 'post_mime_type' => $filetype['type'], 'post_title' => $nameImage, 'post_content' => '', 'post_status' => 'inherit' ); $attachment_id = wp_insert_attachment($attachment, $path_to_file); if(!is_numeric($attachment_id)) { return false; } $attach_data = wp_generate_attachment_metadata( $attachment_id, $path_to_file ); wp_update_attachment_metadata( $attachment_id, $attach_data ); return $attachment_id; }
Внутри функции loadImage — скачиваю через curl с паролем и редиректом картинку и сохраняю её в подпапку upload и на выход уже отдаю внешнюю ссылку на локальный файл через домен (возможно где то здесь косяк). Дальше логика обычная — сохраняю в WP ссылку на этот файл и обновляю методанные (возможно где то должно создаться несколько копий одной фото — митиатюры всякие). Проблема: в админке я вижу что фото на товаре добавлено — но когда открываю страницу на сайте то фото не видно. И когда в медиотеке пытаюсь открыть фото на весь экран через лупу то то же как будто битый файл — видимо как то не правильно добавил фото.
-
Ответ изменён 6 месяцев, 2 недели назад пользователем
rofl113.
Проблема может быть связана с неправильным путем к файлу изображения, который вы передаете в функцию wp_insert_attachment(). Проверьте, что путь $path_to_file указывает на фактический файл изображения, который был загружен на сервер и доступен для чтения.
А также убедитесь, что вы используете правильный URL-адрес изображения в атрибуте «src» тега изображения на странице товара. Проверьте, что этот URL-адрес указывает на фактический файл изображения, который был загружен на сервер и доступен для чтения.
А ещё как вариант проверьте журнал ошибок PHP и журналы ошибок wordpress и woocommerce.
спасибо большое за помощь! По итогу надо было отдавать путь «локальный» итоговый код такой (надо будет потом стиль подчистить):
private function createImageWoocommerce($urlImage, $nameImage) { require_once(ABSPATH . 'wp-admin/includes/media.php'); require_once(ABSPATH . 'wp-admin/includes/file.php'); require_once(ABSPATH . 'wp-admin/includes/image.php'); $path_to_file = $this->loadImage($urlImage, $nameImage); // Установим данные файла $file_array = [ 'name' => $nameImage, 'tmp_name' => $path_to_file, 'error' => 0, 'size' => filesize($path_to_file), ]; $attachment_id = media_handle_sideload( $file_array, 0, $nameImage ); return $attachment_id; }
-
Ответ изменён 6 месяцев, 2 недели назад пользователем
rofl113.
-
Ответ изменён 6 месяцев, 2 недели назад пользователем
- Тема «Load image by url with auth» закрыта для новых ответов.