Поддержка Проблемы и решения Load image by url with auth

  • Решено rofl113

    (@rofl113)


    Добрый всем день!

    Пытаюсь загрузить картинку с внешней ссылки, раньше использовал media_sideload_image, но сейчас появилась авторизация и не понятно как тоже самое сделать теперь?

Просмотр 10 ответов — с 1 по 10 (всего 10)
  • Добрый день.

    Ну если кратко то:

    Получите токен авторизации от внешнего сервиса, где хранится изображение.

    И используя этот токен создаёте запрос на загрузку изображения.

    Спасибо, через 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 ссылку на этот файл и обновляю методанные (возможно где то должно создаться несколько копий одной фото — митиатюры всякие). Проблема: в админке я вижу что фото на товаре добавлено — но когда открываю страницу на сайте то фото не видно. И когда в медиотеке пытаюсь открыть фото на весь экран через лупу то то же как будто битый файл — видимо как то не правильно добавил фото.

    • Ответ изменён 1 год, 1 месяц назад пользователем 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;
    }
    • Ответ изменён 1 год, 1 месяц назад пользователем rofl113.
Просмотр 10 ответов — с 1 по 10 (всего 10)
  • Тема «Load image by url with auth» закрыта для новых ответов.