devdev / in the loop

Preparare le immagini per Lazyload JS in WordPress

<script>
window.lazyLoadOptions = {
    /* your lazyload options */
};
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vanilla-lazyload/8.2.0/lazyload.min.js"></script>

In un precedente articolo, abbiamo visto come integrare il caricamento on scroll delle immagini con Lazyload JS. Possiamo naturalmente applicare lo stesso meccanismo ad un tema WordPress.

Nella pagina di un post, quindi ad esempio nel file single.php , WordPress posizionerà le immagini contenute nell’articolo come responsive images e lo farà usando la tecnica dell’attributo srcset del tag <img> . Se non conoscete questo meccanismo, è molto semplice: all’interno del tag <img> sono presenti diverse dimensioni della stessa immagine e la loro larghezza (width). Il browser selezionerà automaticamente quella adatta alla densità (leggi DPI) dello schermo dell’utente.

Vediamo un esempio di <img> responsive generata da WordPress:

<img
    srcset="/maxresdefault.jpg 1280w,
    /maxresdefault-300x169.jpg 300w,
    /maxresdefault-768x432.jpg 768w,
    /maxresdefault-1024x576.jpg 1024w"
sizes="(max-width: 1280px) 100vw, 1280px">

In questo esempio è ben chiaro che l’immagine è presente in varie misure, dalla più piccola, larga appena 300px (300w) alla più grande da 1280px di larghezza (1280w). Quello che chiediamo al browser è di prendere dal server e mostrarci la più adatta alla densità del nostro schermo.

Adesso facciamo andare d’accordo Lazyload con le responsive image.

Come abbiamo visto nell’articolo relativo a LazyLoad JS, esso si basa sull’attributo data-srcset  e non sul srcset  di default per le immagini. Vediamo allora come far generare correttamente i tag delle immagini dei nostri post per farli processare allo script. Ricordate che questo processo è retroattivo: la modifica funzionerà automaticamente per tutti i nostri post!

Iniziamo aggiungendo questo codice al file functions.php  del nostro tema.

function replace_img_src($content) {
	if (!is_feed()) {
		$content = mb_convert_encoding($content, 'HTML-ENTITIES', "UTF-8");
		$document = new DOMDocument();
		libxml_use_internal_errors(true);
		$document->loadHTML(utf8_decode($content));
		$imgs = $document->getElementsByTagName('img');
		if ($imgs) {
			foreach($imgs as $key=>$value) {
				if ($key !== 0) {
					$value->setAttribute('data-srcset', $value->getAttribute('srcset'));
					$value->removeAttribute('src');
					$value->removeAttribute('srcset');
					$value->removeAttribute('width');
					$value->removeAttribute('height');
				}
			}
		}
		$html = $document->saveHTML();
		return $html;
	}
}

add_filter('the_content', 'replace_img_src');

La function replace_img_src()  si occuperà di modificare automaticamente tutti i tag <img> presenti nel contenuto del post e riscriverà, per ciascuno, gli attributi data-srcset , scrset  e src. A questo punto, dobbiamo includere lo script Lazyload e inizializzarlo.

Il modo più semplice per farlo è incollare questo codice all’interno del file footer.php  del nostro tema, subito prima della chiusura del tag <body> :

<script>
    var myLazyLoad = new LazyLoad();
</script>
<script async src="https://cdnjs.cloudflare.com/ajax/libs/vanilla-lazyload/8.2.0/lazyload.min.js"></script>

Fatto, happy (lazy) loading!

Questo articolo ti è stato utile?
Wordpress – LETTURA 5 MINUTI Abilitare upload di file in WordPress (senza plugin)
Se volessimo caricare nella Libreria Media di WordPress un tipo di file non supportato, riceveremo l’errore: Non hai i permessi…
Wordpress – LETTURA 7 MINUTI WordPress e cron job in modo semplice
WordPress possiede un sistema interno di cron job da poter sfruttare in modo modo semplice, senza l’utilizzo di alcun plugin…
Wordpress – LETTURA 3 MINUTI Ottenere l’URL della pagina attuale in WordPress
Ecco uno snippet che ci permette di ottenere velocemente l’URL della pagina WordPress attuale, non importa se essa è una…
Wordpress – LETTURA 4 MINUTI Visualizzare i tag di una categoria in WordPress
Nella costruzione di un template, spesso ci troviamo a dover ottenere la lista dei tag dei post associati ad una…
Roba figa da
if (weekend) {
    relax();
}
la nostra newsletter, ogni tanto.