wp_get_attachment_image_src e percorso del server
wp_get_attachment_image_src
mi restituisce l'URL e le dimensioni di un'immagine.
Ma esiste un modo per ottenere il percorso sul server per un'immagine ridimensionata (come /html/wordpress/wp-content/uploads/2015/03/cat-2-300x225.jpeg
)? Conosco get_attached_file
ma restituisce solo l'immagine originale.
Vorrei evitare soluzioni approssimative (come sostituzioni di stringhe per i domini) o usare direttamente WP_Image_Editor
. Inoltre dovrebbe funzionare con multisito. C'è qualcosa di ufficiale che mi sono perso?
WordPress non memorizza da nessuna parte il percorso delle dimensioni generate, devi costruirlo.
Come suggerito da @kraftner nei commenti, wp_get_attachment_metadata()
può essere utilizzato per ottenere alcuni degli elementi necessari per costruire il percorso. Un'alternativa è image_get_intermediate_size()
.
Il pezzo mancante è il percorso assoluto della cartella di upload. In teoria, può essere recuperato tramite wp_upload_dir()
ma c'è un problema: quella funzione restituisce la cartella di upload nel momento in cui viene chiamata, ma c'è sempre la possibilità che quando il file è stato caricato il percorso di upload fosse diverso.
Quindi l'unica possibilità è fare l'assunzione che l'immagine scalata si trovi nella stessa cartella dell'immagine originale.
Questa assunzione può sembrare approssimativa, e probabilmente lo è, ma è utilizzata nel core di WordPress stesso da funzioni come image_downsize() che fa esattamente sostituzione di stringhe (vedi riga #184 di media.php
), quindi se stai cercando il modo ufficiale... è questo.
Mettendo tutto insieme:
function scaled_image_path($attachment_id, $size = 'thumbnail') {
$file = get_attached_file($attachment_id, true);
if (empty($size) || $size === 'full') {
// per la dimensione originale get_attached_file va bene
return realpath($file);
}
if (! wp_attachment_is_image($attachment_id) ) {
return false; // l'id non si riferisce a un media
}
$info = image_get_intermediate_size($attachment_id, $size);
if (!is_array($info) || ! isset($info['file'])) {
return false; // probabilmente un argomento size errato
}
return realpath(str_replace(wp_basename($file), $info['file'], $file));
}
La funzione sopra prende l'id dell'allegato e una dimensione e restituisce il percorso.
Ho applicato realpath
prima di restituire i percorsi perché quella funzione restituisce false per i file inesistenti, quindi l'intera funzione restituirà sempre false se qualcosa è andato storto.
L'unica alternativa a questo flusso sarebbe salvare da soli il percorso delle immagini scalate da qualche parte, probabilmente nei post meta, e recuperarlo quando necessario, ma questo può funzionare solo per i file caricati dopo che il tuo plugin è stato attivato...

Ho percorso la strada che hai preso, ho scavato nel codice di generazione delle immagini (alla fine supponendo che l'immagine ridimensionata risieda nella stessa cartella dell'originale) e non mi è piaciuto. Beh, immagino di dovermi arrendere allora. Grazie per la tua risposta elaborata, signore!

Grazie per aver messo tutto insieme! Un rapido post scriptum, per includere il supporto per il ritorno del percorso dei file SVG, dato che non ci sono dimensioni rilevanti da considerare, puoi aggiungere qualcosa come || strtolower(pathinfo($file, PATHINFO_EXTENSION)) == "svg"
alla prima istruzione if
.
