Configurare WebP e AVIF
Prima controllare che cosa sa fare il tuo server
Nella sezione «Immagini» si trova la scheda «Capacità di questo server». Non mostra ciò che sta sulla carta, ma ciò che è stato misurato sul PHP in funzione: libreria di immagini GD con relativa versione, lettura JPEG, lettura PNG, lettura WebP, scrittura WebP, scrittura AVIF. La domanda viene posta due volte — la funzione deve esistere e il formato deve comparire in imagetypes(). Questo è importante, perché alcuni provider di hosting compilano GD senza WebP o AVIF: imagewebp() è allora presente e fallisce solo alla chiamata.
Se manca un formato, il relativo interruttore resta sì visibile, ma è disattivato e riporta la motivazione. Per WebP suona così: GD deve essere compilato con libwebp. Per AVIF: PHP 8.1 o più recente con libavif. Entrambe le cose sono questione del tuo provider di hosting. Una scorciatoia tramite la chiamata AJAX non aiuta — il server rifiuta esplicitamente l'attivazione di un formato non disponibile.
La riga «Imagick» è pura informazione. Questo modulo non usa Imagick; se lì c'è scritto «non presente», non ti manca nulla.
Attivare e impostare i tre numeri
Ci sono tre interruttori e tre campi numerici. «Genera WebP» e «Genera AVIF» sono disattivati di fabbrica, «Servi tramite <picture>» è attivato. La separazione è voluta: puoi anzitutto far nascere i file e attivare la consegna in un secondo momento. Vale anche il contrario: se disattivi la consegna, i file continuano a nascere, ma ai visitatori va markup invariato.
La qualità WebP è su 82, la qualità AVIF su 50. Entrambi i campi accettano valori da 30 a 100, tutto ciò che sta sopra o sotto viene riportato entro questo intervallo. I valori predefiniti diversi non sono una svista: AVIF misura in modo diverso da JPEG, lì 50 appare già molto pulito. Oltre 90 con WebP il file cresce più in fretta del guadagno visibile.
Il limite massimo in megapixel è su 40 e accetta valori da 4 a 400. Protegge dal limite di memoria: una foto da 6000 × 4000 occupa nella decodifica circa 96 MB, indipendentemente da quanto è grande il suo file. Inoltre, prima di ogni decodifica Kakapo fa i conti con la memoria effettivamente ancora libera e salta l'immagine, invece di lasciar morire il caricamento contro il limite.
Se modifichi uno dei tre interruttori, la cache delle pagine depositata viene scartata. Qualità e limite di megapixel la lasciano intatta — agiscono solo al caricamento successivo e non rendono errata nessuna pagina già depositata.
Che cosa succede durante il caricamento
La conversione avviene alla fine del caricamento, non appena WordPress ha generato tutte le dimensioni dell'immagine. Vengono elaborati il file indicato nei metadati e ogni dimensione generata — non l'originale conservato dal core, che comunque non viene mai servito.
Ogni versione derivata si trova come file di accompagnamento accanto al suo originale e ne porta il nome completo più l'estensione: da bild.jpg nasce bild.jpg.webp, non bild.webp. Motivo: nella stessa cartella bild.jpg e bild.png possono stare l'uno accanto all'altro; con la semplice sostituzione dell'estensione una versione derivata cancellerebbe l'altra. Se nella destinazione c'è già qualcosa, non viene toccato.
La scrittura avviene dapprima in un file accessorio con numero di processo e una parte casuale nel nome. Solo quando, rimisurato, risulta più piccolo dell'originale, prende il suo posto tramite rename. Se è più grande o della stessa dimensione, viene cancellato e resta l'originale. Un'esecuzione interrotta non lascia quindi mai una versione derivata troppo grande.
Il caricamento ha un budget di tempo di 12 secondi. Nella generazione AVIF è molte volte più lento di WebP, e altrimenti sei dimensioni per due formati finiscono nel tempo di esecuzione del server web — il gestore vedrebbe un caricamento interrotto. Ciò che non entra più lo recupera una singola passata successiva: viene pianificata 30 secondi dopo e ha allora 90 secondi di tempo. Tanto ciò che è stato fatto quanto ciò che è stato saltato viene annotato sull'allegato, affinché lo stesso tentativo non venga ripetuto a ogni rigenerazione.
Con i JPEG viene applicata anche la rotazione EXIF, perché WebP e AVIF prodotti da GD non portano con sé questa indicazione. Con gli originali PNG Kakapo prova WebP dapprima senza perdita — loghi, grafiche e screenshot diventano così spesso più piccoli, senza che i bordi si sfilaccino. La trasparenza si conserva in entrambi i formati di destinazione.
Come avviene la consegna
Kakapo racchiude l'<img> in un <picture> e vi antepone sorgenti AVIF e WebP, prima AVIF — il browser prende la prima sorgente che comprende. Il <picture> riceve display:contents, così da non inserire un riquadro aggiuntivo nella disposizione dei layout flex e grid del tuo tema.
Scelta consapevolmente al posto dell'alternativa tramite .htaccess: la negoziazione dei contenuti richiede regole Apache, su nginx non funziona affatto ed entra in conflitto con le cache intermedie dei CDN che non variano l'header Accept. Con <picture> decide il browser, senza una riga di configurazione del server.
L'intervento riguarda i contenuti degli articoli e le immagini in evidenza, con priorità 22 — dopo il Lazy-Load (20), prima della riscrittura CDN (25), affinché anche le sorgenti appena nate passino per il CDN. I blocchi <picture> già presenti restano intatti, così come le immagini di host estranei e tutto ciò che sta fuori dalla cartella uploads.
Vale la pena conoscere una regola: un formato viene proposto solo se la versione più grande nel srcset è presente come versione derivata. Se ne manca una media o piccola, il browser ricorre a quella immediatamente più grande — qualche kilobyte in più, ma mai un'immagine sfocata. Se mancasse la più grande, uno schermo largo non potrebbe più arrivare alla risoluzione piena; proprio questo caso viene escluso.
Se non nasce nulla: leggere i motivi
La scheda «File generati & risparmio reale» mostra per ogni formato il numero di file, la somma degli originali, la somma delle versioni derivate e la differenza. Ogni numero deriva dal confronto di due dimensioni reali dei file nel momento della generazione — niente è stimato o estrapolato. «Originali» è qui solo la somma dei file per i quali è nata una versione derivata, non l'intero tuo archivio multimediale.
Sotto è indicato che cosa non è stato convertito, con il motivo. I più importanti:
«Il risultato era più grande dell'originale» — non è un errore. Con le miniature molto piccole succede regolarmente con AVIF; l'originale resta e le altre dimensioni ricevono comunque la loro versione derivata.
«Non scrivibile» — verifica i permessi nella cartella uploads. È l'unico motivo che richiede davvero il tuo intervento.
«Nella destinazione c'era già un file» — non è stato sovrascritto. Per lo più proviene dall'esecuzione in blocco sull'archivio esistente ed è già esattamente ciò che qui doveva nascere.
«Non è entrato in memoria» — alza il limite di megapixel o il limite di memoria di PHP.
«Non leggibile» — file danneggiato, JPEG in CMYK o una variante esotica. «Non è JPEG/PNG/WebP» — le animazioni GIF e i PDF non vengono toccati di proposito.
Se la scheda è vuota, attiva WebP e carica un'immagine. Le immagini che si trovano già nella libreria multimediale non le raggiungi da qui, ma con l'esecuzione in blocco più in basso nella stessa pagina.