wp_get_attachment_image_src и путь к файлу на сервере

27 мар. 2015 г., 15:33:15
Просмотры: 13.9K
Голосов: 6

wp_get_attachment_image_src возвращает URL и размеры изображения.

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

Хотелось бы избежать нестандартных решений (таких как замена доменов в строке) или прямого использования WP_Image_Editor. Также решение должно работать в мультисайтовой среде. Может быть, есть официальный метод, который я упустил?

5
Комментарии

Это кажется дубликатом, но содержит указанные вами недостатки. Просто публикую для полноты картины. :)

kraftner kraftner
27 мар. 2015 г. 16:03:32

вы смотрели http://codex.wordpress.org/Function_Reference/wp_get_attachment_metadata

kraftner kraftner
27 мар. 2015 г. 16:12:06

Да. Но это просто возвращает что-то вроде 2015/03/cat-2.jpeg. Хотя оно также возвращает все имена файлов для сгенерированных миниатюр, но только имена файлов — и это снова приводит к громоздкой манипуляции с путями.

maryisdead maryisdead
27 мар. 2015 г. 16:35:31

Я знаю, но боюсь, это максимально близкий вариант. Можно также спросить, для чего вам это нужно?

kraftner kraftner
27 мар. 2015 г. 16:42:25

Я работаю над плагином для интеграции изображения записи как RSS enclosure в генерируемые WordPress ленты и поэтому мне нужно знать размер файла (и его MIME-тип).

maryisdead maryisdead
27 мар. 2015 г. 17:03:17
Все ответы на вопрос 1
2
17

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, если что-то пошло не так.

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

28 мар. 2015 г. 01:30:32
Комментарии

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

maryisdead maryisdead
30 мар. 2015 г. 23:04:28

Спасибо за эту реализацию! Небольшое дополнение: чтобы добавить поддержку возврата пути для SVG-файлов (поскольку для них не имеет значения размер), можно добавить условие || strtolower(pathinfo($file, PATHINFO_EXTENSION)) == "svg" в первый оператор if.

Tim Malone Tim Malone
16 авг. 2016 г. 08:49:43