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. Также он должен быть многосайтовым. Есть ли что-то официальное, что я только что пропустил?

Author: maryisdead, 2015-03-27

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

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

 13
Author: gmazzap, 2017-04-13 12:37:56