wp_get_attachment_image_src y la ruta del servidor
wp_get_attachment_image_src
me proporciona la URL y dimensiones de una imagen.
¿Pero hay alguna forma de obtener la ruta del servidor para una imagen escalada (como /html/wordpress/wp-content/uploads/2015/03/cat-2-300x225.jpeg
)? Conozco get_attached_file
pero esto solo devuelve la imagen original.
Me gustaría evitar soluciones poco elegantes (como reemplazar cadenas de dominios) o usar WP_Image_Editor
directamente. Además, debería funcionar en multisitio. ¿Hay algo oficial que me haya perdido?
WordPress no almacena la ruta de los tamaños generados en ningún lugar, necesitas construirlo.
Como sugiere @kraftner en los comentarios, wp_get_attachment_metadata()
puede usarse para obtener algunas de las piezas que necesitas para construir la ruta. Una alternativa es image_get_intermediate_size()
.
La pieza faltante es la ruta absoluta de la carpeta de subida. En teoría, eso se puede obtener mediante wp_upload_dir()
, pero hay un problema: esa función devuelve la carpeta de subida en el momento en que se llama, pero siempre existe la posibilidad de que cuando el archivo se subió, la ruta de subida era diferente.
Así que la única posibilidad es asumir que la imagen escalada está en la misma carpeta que la imagen original.
Esta suposición puede parecer un truco, y probablemente lo sea, pero se usa en el núcleo de WordPress mismo por funciones como image_downsize() que hace exactamente un reemplazo de cadenas (ver línea #184 de media.php
), así que si buscas la forma oficial... esa es la que es.
Juntando todo:
function scaled_image_path($attachment_id, $size = 'thumbnail') {
$file = get_attached_file($attachment_id, true);
if (empty($size) || $size === 'full') {
// para el tamaño original, get_attached_file es suficiente
return realpath($file);
}
if (! wp_attachment_is_image($attachment_id) ) {
return false; // el id no se refiere a un archivo multimedia
}
$info = image_get_intermediate_size($attachment_id, $size);
if (!is_array($info) || ! isset($info['file'])) {
return false; // probablemente un argumento de tamaño incorrecto
}
return realpath(str_replace(wp_basename($file), $info['file'], $file));
}
La función anterior toma el id del adjunto y un tamaño y devuelve la ruta.
He aplicado realpath
antes de devolver las rutas porque esa función devuelve false para archivos que no existen, así que la función completa siempre devuelve false si algo salió mal.
La única alternativa a este flujo sería guardar por ti mismo la ruta de la(s) imagen(es) escalada(s) en algún lugar, probablemente en post meta, y recuperarla cuando sea necesario, pero eso solo puede funcionar para archivos subidos después de que tu plugin haya sido activado...

He recorrido el camino que tomaste, revisé el código de generación de imágenes (al final asumiendo que la imagen escalada reside en la misma carpeta que la original) y no me gustó. Bueno, supongo que tendré que dar marcha atrás entonces. ¡Gracias por tu respuesta detallada, señor!
