wp_get_attachment_image_src и путь к файлу на сервере
wp_get_attachment_image_src
возвращает URL и размеры изображения.
Но есть ли способ получить путь к файлу на сервере для масштабированного изображения (например, /html/wordpress/wp-content/uploads/2015/03/cat-2-300x225.jpeg
)? Я знаю о функции get_attached_file
, но она возвращает только путь к оригинальному изображению.
Хотелось бы избежать нестандартных решений (таких как замена доменов в строке) или прямого использования WP_Image_Editor
. Также решение должно работать в мультисайтовой среде. Может быть, есть официальный метод, который я упустил?

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') {
// для оригинального размера get_attached_file подходит
return realpath($file);
}
if (! wp_attachment_is_image($attachment_id) ) {
return false; // ID не относится к медиафайлу
}
$info = image_get_intermediate_size($attachment_id, $size);
if (!is_array($info) || ! isset($info['file'])) {
return false; // вероятно, неверный аргумент размера
}
return realpath(str_replace(wp_basename($file), $info['file'], $file));
}
Приведённая выше функция принимает ID вложения и размер, а затем возвращает путь.
Я применил realpath
перед возвратом путей, потому что эта функция возвращает false для несуществующих файлов, поэтому вся функция всегда вернёт false, если что-то пошло не так.
Единственной альтернативой этому подходу было бы сохранение путей масштабированных изображений самостоятельно, вероятно, в метаданных записи, и их извлечение при необходимости. Но это будет работать только для файлов, загруженных после активации вашего плагина...

Прошел по тому же пути, копался в коде генерации изображений (в итоге предположив, что масштабированное изображение находится в той же папке, что и оригинал), и мне это не понравилось. Что ж, видимо, придется отступить. Спасибо за развернутый ответ!
