wp получает src изображения вложения и путь к серверу
wp_get_attachment_image_src
даст мне URL-адрес и размеры изображения.
Но есть ли какой-либо способ получить путь к серверу для масштабированного изображения (например, /html/wordpress/wp-content/uploads/2015/03/cat-2-300x225.jpeg
)? Я знаю о get_attached_file
но это возвращает только исходное изображение.
Я бы хотел избежать хакерских решений (домены, заменяющие строки, и тому подобное) или прямого использования WP_Image_Editor
. Также он должен быть многосайтовым. Есть ли что-то официальное, что я только что пропустил?
1 answers
WordPress нигде не хранит путь сгенерированных размеров, вам нужно построить его.
Как предложил @kraftner в комментариях, wp_get_attachment_metadata()
может быть использован для получения некоторых частей, необходимых для построения пути. Альтернативой является image_get_intermediate_size()
.
Недостающая часть - это абсолютный путь к папке загрузки. Теоретически, которые могут быть получены с помощью wp_upload_dir()
но есть проблема: эта функция возвращает папку загрузки в данный момент он вызывается, но всегда есть вероятность, что при загрузке файла путь загрузки был другим.
Таким образом, единственная возможность состоит в том, чтобы предположить, что масштабированное изображение находится в той же папке, что и исходное изображение.
Это предположение может показаться хакерским, и, вероятно, так оно и есть, но оно используется в самом ядре WordPress такими функциями, как image_downsize(), которые точно заменяют строку (см. строку #184 из media.php
), так что если вы ищете официальный способ.. это тот самый.
Объединение вещей:
function scaled_image_path($attachment_id, $size = 'thumbnail') {
$file = get_attached_file($attachment_id, true);
if (empty($size) || $size === 'full') {
// for the original size get_attached_file is fine
return realpath($file);
}
if (! wp_attachment_is_image($attachment_id) ) {
return false; // the id is not referring to a media
}
$info = image_get_intermediate_size($attachment_id, $size);
if (!is_array($info) || ! isset($info['file'])) {
return false; // probably a bad size argument
}
return realpath(str_replace(wp_basename($file), $info['file'], $file));
}
Функция выше принимает идентификатор вложения и размер и возвращает путь.
Я подал заявление realpath
прежде чем возвращать пути, потому что эта функция возвращает false для несуществующих файлов, поэтому вся функция всегда возвращает false, если что-то пошло не так.
Единственной альтернативой этому потоку было бы сохранение самостоятельно пути масштабированного изображения(изображений) где-нибудь, возможно, опубликуйте мета-данные и извлеките их при необходимости, но это может работать только для файлов, загруженных после активации вашего плагина...