Вопрос или проблема
Я искал в 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. Ниже приведены шаги и детали, необходимые для реализации данной задачи.
Шаги для возврата изображения из скрипта
-
Подключение WordPress: Поскольку вы работаете в контексте плагина, следует убедиться, что все функции WordPress загружены. В вашем скрипте добавьте следующую строку:
include("../../../wp-load.php");
Это позволит использовать функции WordPress, включая обработку загрузок медиа.
-
Использование
download_url()
: Вы правильно используете функциюdownload_url()
, однако она должна быть выполнена в контексте WordPress, что и обеспечивается первым шагом. -
Создание миниатюры: Для загрузки изображения и его последующего изменения размера рекомендуется использовать функции
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, чтобы избежать ошибок, связанных с отсутствующими функциями. Также помните о том, что использование внешних изображений может быть ограничено правилами контента и авторскими правами; следите за тем, чтобы ваш способ использования был допустимым.