Как мне вернуть изображение из скрипта

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

Я искал в Google, но, похоже, использую неправильные термины. Я пытаюсь добавить скрипт к своему плагину WordPress, который берет URL и возвращает отформатированное изображение. Я знаю, что это не приветствуется, так как является горячей ссылкой. В моем случае изображение предоставляется веб-сервисом для обработки изображений.

Создание изображения занимает от 3 до 5 секунд. У меня есть JavaScript, который устанавливает тег src для предварительного просмотра изображения, как только вводится URL веб-сайта (onblur). Мне нужно найти способ загрузить изображение полного размера с сервиса и изменить его размер до миниатюры (я менял размер в браузере, но это выглядело ужасно). Я пытался получить доступ к функции download_url() WordPress из своего скрипта, но получаю много неразрешенных ссылок. Я уверен, что делаю что-то не так.

Мой существующий код:

<?php
require_once('../../../wp-admin/includes/file.php');
$im = download_url('http://www.linux.org/images/logo/linuxorg.gif'); 
header('content-type: image/gif'); 
// изменить размер и отправить данные изображения здесь...

Я получаю следующую ошибку:

Фатальная ошибка: Вызов неопределенной функции __() в /homepages/5/d367772185/htdocs/rodandfly/wp-admin/includes/file.php на строке 13

Фатальная ошибка: Вызов неопределенной функции __() в
/homepages/5/d367772185/htdocs/rodandfly/wp-admin/includes/file.php на
строке 13

Где ваш код? file.php ожидает, что __() будет определена, что должно происходить, если вы загружаете его из активированного плагина.

Лучший способ сделать то, что вы пытаетесь сделать — использовать либо media_handle_sideload(), либо media_sideload_image(), которые заставят WordPress создать миниатюры из полного изображения.

$resized_img_url = wpse_download_resize( 'http://www.linux.org/images/logo/linuxorg.gif' );

function wpse_download_resize( $url ) {
    $tmp = download_url( $url );
    $file = array(
        'name' => basename( $url ),
        'tmp_name' => $tmp
    );

    if ( is_wp_error( $tmp ) ) {
        @unlink( $file[ 'tmp_name' ] );
    return $tmp;
    }

    $id = media_handle_sideload( $file, 0 );
    // Проверка на ошибки обработки sideload.
    if ( is_wp_error( $id ) ) {
        @unlink( $file['tmp_name'] );
    return $id;
    }

    return wp_get_attachment_thumb_url( $id );
}

Основная проблема в том, что вам нужно, чтобы ваш код выполнялся в контексте WordPress, а похоже, вы пытаетесь сделать это наоборот (выполнить код WordPress в контексте вашего скрипта).

Способ достижения этого — отправить ваш запрос на создание изображения на основной URL WordPress и использовать либо переменные $_POST, либо $_GET, чтобы указать, что запрос предназначен для обработки вашим кодом, привязаться к действию init и определить, является ли запрос вашим кодом, сгенерировать все, что вам нужно, и выйти.

Это потому, что у вас нет стандартного WordPress со всеми его функциями загруженными. Вам придется добавить эту строку:

include("../../../wp-load.php");

Ответ или решение

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

Шаги для возврата изображения из скрипта

  1. Подключение WordPress: Поскольку вы работаете в контексте плагина, следует убедиться, что все функции WordPress загружены. В вашем скрипте добавьте следующую строку:

    include("../../../wp-load.php");

    Это позволит использовать функции WordPress, включая обработку загрузок медиа.

  2. Использование download_url(): Вы правильно используете функцию download_url(), однако она должна быть выполнена в контексте WordPress, что и обеспечивается первым шагом.

  3. Создание миниатюры: Для загрузки изображения и его последующего изменения размера рекомендуется использовать функции media_handle_sideload() или media_sideload_image(). Они автоматически создадут миниатюры и упрощают процесс.

Пример кода

Ваша функция для загрузки и изменения размера изображения может выглядеть следующим образом:

function wpse_download_resize($url) {
    // Сначала загружаем изображение
    $tmp = download_url($url);

    // Проверяем, была ли ошибка при загрузке
    if (is_wp_error($tmp)) {
        return $tmp; // Возвращаем ошибку
    }

    // Упаковка файла в массив
    $file = array(
        'name' => basename($url),
        'tmp_name' => $tmp
    );

    // Используем media_handle_sideload для создания записи в медиа-библиотеке
    $id = media_handle_sideload($file, 0);

    // Проверяем на ошибки при обработке
    if (is_wp_error($id)) {
        @unlink($file['tmp_name']); // Удаляем временный файл
        return $id; // Возвращаем ошибку
    }

    // Получаем URL миниатюры
    return wp_get_attachment_thumb_url($id);
}

Вызов функции

Теперь, чтобы вернуть изображение в ответ на AJAX-запрос или при загрузке страницы, вы можете использовать следующий код:

add_action('init', 'my_custom_image_request');

function my_custom_image_request() {
    if (isset($_GET['image_url'])) {
        $url = esc_url($_GET['image_url']); // Экранируем URL
        $thumbnail_url = wpse_download_resize($url);

        // Отправляем заголовки и возвращаем миниатюру
        if (!is_wp_error($thumbnail_url)) {
            header('Content-Type: application/json');
            echo json_encode(['thumbnail' => $thumbnail_url]);
        } else {
            header('HTTP/1.1 500 Internal Server Error');
            echo json_encode(['error' => $thumbnail_url->get_error_message()]);
        }
        exit; // Завершение скрипта
    }
}

Заключение

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

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

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