wp_get_attachment_image_src e percorso del server

27 mar 2015, 15:33:15
Visualizzazioni: 13.9K
Voti: 6

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?

5
Commenti

Questo sembra essere un duplicato, ma presenta i difetti che hai menzionato. Lo posto solo per completezza. :)

kraftner kraftner
27 mar 2015 16:03:32

Sì. Ma restituisce solo qualcosa come 2015/03/cat-2.jpeg. Anche se restituisce anche tutti i nomi dei file per le miniature generate, ma solo i nomi dei file - e questo porta di nuovo a una manipolazione complicata dei percorsi.

maryisdead maryisdead
27 mar 2015 16:35:31

Lo so, ma temo che sia la cosa più vicina che puoi ottenere. Posso anche chiederti a cosa ti serve?

kraftner kraftner
27 mar 2015 16:42:25

Sto lavorando a un plugin per integrare l'immagine del post come enclosure RSS nei feed generati da WordPress e quindi ho bisogno di conoscere la dimensione del file (e il tipo MIME).

maryisdead maryisdead
27 mar 2015 17:03:17
Tutte le risposte alla domanda 1
2
17

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...

28 mar 2015 01:30:32
Commenti

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!

maryisdead maryisdead
30 mar 2015 23:04:28

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.

Tim Malone Tim Malone
16 ago 2016 08:49:43