Faq quoll tech

Faq

Pubblicato il Pubblicato in Faq, System administrator
See the article in English

In questo articolo raccogliamo tutte le FAQ ordinate e raggruppate per categoria.

bash

Rinominare un gruppo di file in base ad una regexpr

Supponiamo di voler rinominare il nome di un gruppo di file che hanno il seguente template:
file1_tmp.sh
file2_tmp.sh
...
file99_tmp.sh
e supponiamo di voler togliere la parte centrale ‘_tmp’ in tutti i file. Possiamo utilizzare il comando “rename” o “prename”:
 rename 's/_tmp//' *.sh
  Vedi tutte le FAQs

Redirigere lo standard error sullo standart output

Per redirigere lo standard error di un comando in shell basta utilizzare la seguente sinstassi seguente:

ls file_non_esistente 2>&1 | grep File

oppure ancor meglio per non avere sul terminale lo standard error basta buttarlo in /dev/null

ls file_non_esistente 2>/dev/null

Gli identificativi standard o canali standard (o standard streams) aperti automaticamente sono:

  • 0 standard input
  • 1 standard output
  • 2 standard error

 

Vedi tutte le FAQs

Uso di array semplici in bash

Con Bash per dichiarare esplicitamente un array bisogna utilizzare

declare -A mioarray

Per avere il valore dell’elemento 5 basta scrivere

echo $[mioarray[5]

mentre per cambiare il valore  bisogna scrivere

mioarray[5]='nuovo valore'

${mioarray[*]} o ${mioarray[@]} viene espanso da tutti i valori dell’array mentre $[#mionome[@]} viene espanso con la lunghezza dell’array

Cosa possiamo fare con gli array? Ad esempio memorizzare l’output di un comando di cui ogni riga vorremmo che vada su un elemento differente.

IFS=$'\n' mioarray=($(ls -alh))

A questo punto possiamo stampare l’output come

 IFS=$'\n' echo "${mioarray[*]}"

Attenzione: i doppi apici sono importanti per non avere l’output su un’unica riga.

Facendo così potremmo fare diversi test sullo stesso output catturato una sola volta.

 

 

Vedi tutte le FAQs

Uso di array associativi in bash

Per dichiarare un array associativo bisogna dichiararlo con

declare -A mioarray/

e come indice si può utilizzare una stringa, questo significa che

mioarray[test]='aa'
echo ${mioarray[test]} # restituisce 'aa'

 

Vedi tutte le FAQs

Convertire da Bash un numero decimale in binario

Supponiamo di star lavorando su uno script bash e che per qualche esigenza, nemmeno troppo difficile dalla realtà, sia indispensabile dover convertire un numero o una variabile decimale in numero binario.

Ci sono naturalmente diverse soluzioni ma quella che vi propongo non fa utilizzo di programmi esterni ma è bash a tutti gli effetti.

Per prima cosa dobbiamo sapere il valore massimo del numero binario da ottenere in Bash ovvero in quanti bit potrà essere compreso.

Consideriamo che stiamo parlando di un byte e quindi 8 bit e cioè il numero binario andrà da 00000000 a 11111111 (da 0 a 255) allora possiamo scrivere:

bin=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
echo ${bin[*]}
come convertire un numero decimale in binario con bash
bash – array di numeri binari

Il più è fatto, infatti per avere il risultato ad esempio del numero 125 o di 78 in binario basta semplicemente

echo ${bin[125]}
01111101
echo ${bin[78]}
01001110

Se cambia il range del numero binario ad esempio se raddoppiamo o quadruplichiamo basta che definiamo la variabile bin con uno o due blocchi in più del tipo {0..1}.

Quindi riassumendo, la variabile bin dovrà contenere tanti blocchi {0..1} in base al numero massimo binario che si vuole ottenere cioè se il massimo numero è 2n -1 allora ci vorranno n gruppi {0..1}.

Come esempio se n=10 e quindi 210 -1=1023 i blocchi saranno 10

bin=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
echo ${bin[1023]}
1111111111
Vedi tutte le FAQs

Convertire da Bash un numero decimale in esadecimale

Come per la faq con la conversione in binario anche in questa facciamo utilizzo delle fantastiche estensioni bash sulle parentisi graffe per convertire in esadecimale.

Quindi, considerando sempre la faq bash sul binario partiamo inizialmente con il convertire un numero decimale tra 0 e 255 che corrisponde ad una cifra esadecimale tra 0 ed FF:

hex=({{0..9},{a..f}}{{0..9},{a..f}})
echo ${hex[*]}
come convertire un numero decimale in esadecimale con bash
bash- array di numeri esadecimali

A questo punto per avere il risultato del numero 200 oppure di 21 basta

echo ${hex[200]}
c8
echo ${hex[21]}
15

Se cambia il range del numero esadecimale ad esempio se raddoppiamo o quadruplichiamo basta che definiamo la variabile hex con uno o due blocchi in più del tipo {0..9},{a..f}.

Quindi riassumendo, la variabile hex dovrà contenere tanti blocchi {0..9},{a..f} in base al numero massimo binario che si vuole ottenere cioè se il massimo numero è 16n -1 allora ci vorranno n gruppi {0..9},{a..f}.

Come esempio se n=4 e quindi 164 -1=65535 i blocchi saranno 4

hex=({{0..9},{a..f}}{{0..9},{a..f}}{{0..9},{a..f}}{{0..9},{a..f}})
echo ${hex[60000]}
ea60
echo ${hex[37]}
0025
Vedi tutte le FAQs

Come convertire una netmask IPV4 in CIDR

Per passare da una netmask IPV4 a l’equivalente CIDR potrebbe venir in mente di fare la cosa più semplice ovvero utilizzare un blocco case o degli if annidati per ottenere il CIDR equivalente tanto i netmask o CIDR disponibili sono solo 32 e cioè

NetmaskAddress/CIDRAdresses
255.255.255.255a.b.c.d/3220
255.255.255.254a.b.c.d/3120
255.255.255.252a.b.c.d/3021
255.255.255.248a.b.c.d/2922
255.255.255.240a.b.c.d/2823
255.255.255.224a.b.c.d/2724
255.255.255.192a.b.c.d/2625
255.255.255.128a.b.c.d/2526
255.255.255.0a.b.c.0/2427
255.255.254.0a.b.c.0/2328
255.255.252.0a.b.c.0/2229
255.255.248.0a.b.c.0/21210
255.255.240.0a.b.c.0/20212
255.255.224.0a.b.c.0/19213
255.255.192.0a.b.c.0/18214
255.255.128.0a.b.c.0/17215
255.255.0.0a.b.0.0/16216
255.254.0.0a.b.0.0/15217
255.252.0.0a.b.0.0/14218
255.248.0.0a.b.0.0/13219
255.240.0.0a.b.0.0/12220
255.224.0.0a.b.0.0/11221
255.192.0.0a.b.0.0/10222
255.128.0.0a.b.0.0/9223
255.0.0.0a.0.0.0/8224
254.0.0.0a.0.0.0/7225
252.0.0.0a.0.0.0/6226
248.0.0.0a.0.0.0/5227
240.0.0.0a.0.0.0/4228
224.0.0.0a.0.0.0/3229
192.0.0.0a.0.0.0/2230
128.0.0.0a.0.0.0/1231
0.0.0.00.0.0.0/0232
Netmask to CIDR

Se vogliamo, invece, realizzare una funzione che converta il netmask in CIDR abbiamo bisogno di sapere come convertire un numero decimale in binario come prima cosa.

fromNetmaskToCidr() {
  local netmask=$1
  local bin=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
  local b=''
  local n
  local cidr
  for n in ${netmask//./ }; do
    if [ $n -gt 255 ]; then
      echo -e "\t[ERROR] netmask $netmask format error in '.$n'. I will use .255 insted of .$n"
      n=255
    fi
    if [ $n -ne 0 -a $n -ne 128 -a $n -ne 192 -a $n -ne 224 -a $n -ne 240 -a $n -ne 248 -a $n -ne 252 -a $n -ne 254 -a $n -ne 255 ]; then
      echo -e "\t[ERROR] netmask $netmask format error in '.$n' (it must be 0,128,192,224,240,248,252,254,255). I will use .255 insted of .$n"
      n=255
    fi
    # $b is the binary of $netmask
    b=${b}${bin[$n]}
  done
  # remove right "0" bits from $b
  b=${b/%0*}
  cidr=${#b}
  echo $cidr
}

Quel che si fa è convertire i 4 ottetti del netmask in binario e metterli in serie nell’unica variabile “b” quindi rimuovere i bit a 0 presenti nella destra del numero binario complessivo.
Infine basta contare il numero dei bit rimasti per avere il CIDR che poi verrà restituito in uscita.

Riferimenti

Vedi tutte le FAQs

lvm

Aggiunta di un disco in LVM

Supponiamo di volere aggiungere un disco o una sua partizione nel gestore LVM di Linux e creare un volume group di nome “quollvg” con un volume logico di nome “quolllv” di dimensione 50GB.

controlliamo l’elenco dei dischi con il comando:

fidisk -l

Supponiamo che /dev/sdb sia il disco da aggiungere

Lanciamo il comando (lvm)

pvcreate /dev/sdb

Se abbiamo intenzione di usare una partizione, ad esempio la 1 del disco, dopo averla creata ed associato il tipo 83 (LVM) usiamo il comando:

pvcreate /dev/sdb1

A questo punto creiamo il volume group ed il volume logico, formattiamo e montiamo il nuovo disco :

vgcreate quollvg /dev/sdb
lvcreate -L 50G -n quolllv quollvg
mkdir /quolllv
mkfs.ext4dev -m 1 /dev/quolvg/quollv
mount /dev/mapper/quollvg-quolllv /quolllv

Per vedere lo stato del volume logico e del volume group:

lvdisplay
vgdisplay

 

 

Vedi tutte le FAQs

Aggiungere un disco ad un volume group in LVM

Supponiamo di aver un volume group LVM di nome “quollvg” pieno o quasi pieno e di voler aggiungere dell’altro spazio avendo a disposizione un altro disco o un’altra partizione libera.

Supponiamo che il disco libero sia /dev/sdc (o /dev/sdc1) allora quello che dobbiamo fare è semplicemente:

pvcreate /dev/sdc
vgextend quollvg /dev/sdc

 

Vedi tutte le FAQs

Aumentare la dimensione di una partizione LVM

Supponiamo di voler aumentare di 10G la dimensione della partizione ext4 del volume logico “quolllv” appartenente al volume group “quollvg”.

Per prima cosa controlliamo che il volume group “quollvg” abbia almeno 10GB liberi (sarebbe bene per un system administrator lasciare sempre libero in ogni volume group almeno dal 3% al 5% dello spazio nel caso in cui serva fare una snap per il backup o per qualche altro motivo)

vgdisplay quollvg

e controllare la sezione “Free PE / Size” per verificare che ci sia spazio disponibile.

Usare il comando per allargare il logical volume “quolllv“:

lvresize -L +10G /dev/quollvg/quolllv

A questo punto il logical volume “quolllv” è più grande di 10GB; bisogna quindi farlo sapere anche al file system ext4:

resize2fs /dev/mapper/quollvg-quolllv

Il resize2fs viene fatto anche caldo (a disco montato) quindi non preoccupatevi se è occupato da altro e non può esser smontato

Vedi tutte le FAQs

Come creare una snapshot di un logical volume

Supponiamo di voler creare una snapshot del logical volume “quolllv” già esistente appartenente al volume group “quollvg“.

Controlliamo prima che ci sia spazio a sufficienza nel volume group:

vgdisplay quollvg

Controlliamo che “Free PE / Size” non sia tutto già occupato e supponiamo di avere 5GB di spazio da poter utilizzare per la snapshot:

lvcreate -L +5G -s -n "quolllv_snap" /dev/quollvg/quolllv

A questo punto abbiamo a disposizione la snapshot come verificabile digitando il comando:

lvdisplay

Possiamo quindi montarla ed utilizzarla:

mkdir /snap
mount /dev/mapper/quollvg-quolllv_snap /snap

Dopo averci lavorato (ad esempio dopo il backup) possiamo tranquillamente eliminare la snapshot:

umount /snap
lvremove -f /dev/quollvg/quolllv_snap
rmdir /snap

 

Vedi tutte le FAQs

openssl

Estrazione del contenuto di un file firmato digitalmente (p7m)

Consideriamo il caso in cui il documento firmato sia un pdf (documento.pdf.p7m).

Per estrarre il file contenuto utilizziamo il comando openssl con il parametro smime per la verifica della firma (-verify)

openssl smime -verify -noverify -in documento.pdf.p7m -inform DER -out documento.pdf

Per maggiori informazioni vedere l’articolo

Vedi tutte le FAQs

Estrazione del certificato di un file firmato digitalmente (p7m)

Consideriamo il caso in cui il documento firmato sia un pdf (documento.pdf.p7m).

Per estrarre il certificato utilizzato per firmare il p7m utilizziamo il comando openssl con il parametro pkcs

openssl pkcs7 -inform DER -in documento.pdf.p7m -print_certs -out cert.pem

il certificato verrà estratto nel file cert.pem e se si vuole visualizzare in modo testuale basta il comando per i certificati x509

openssl x509 -in cert.pem -text -noout

Per maggiori informazioni vedere l’articolo

Vedi tutte le FAQs

Verifica della firma di un documento p7m

Consideriamo il caso in cui il documento firmato sia un pdf (documento.pdf.p7m).

Per verificare la firma ed estrarre il file contenuto utilizziamo il comando openssl con il parametro smime per la verifica della firma (-verify)

openssl smime -in documento.pdf.p7m -inform DER -verify -CAfile CA.pem -out documento.pdf

Dove CA.pem contiene il certificato della CA (Certificate Authority) che ha rilasciato il certificato presente nel p7m.

Per maggiori informazioni vedere l’articolo

Vedi tutte le FAQs

Trust certificate authority per firma digitale

Se si tenta di verificare la firma di un file p7m senza il certificato dell’ente certificatore (la CA), la verifica fallisce (“unable to load certificate“) perché non abbiamo i certificati di fiducia della CA (i cosiddetti Trust).
Tali Certificate Authority sono state definite per legge italiana e sono registrati sul CNIPA, che dal dicembre 2009 è diventato DigitPA, come portafoglio di certificati XML e li ho trovati sullo stesso sito all’indirizzo https://applicazioni.cnipa.gov.it/TSL/_IT_TSL_signed.xml.
Per far in modo che openssl li gestisca bisogna metterli nel suo formato quindi:

wget -O - https://applicazioni.cnipa.gov.it/TSL/_IT_TSL_signed.xml | perl -ne 'if (/<X509Certificate>/) {
s/^\s+//; s/\s+$//;
s/<\/*X509Certificate>//g;
print "-----BEGIN CERTIFICATE-----\n";
while (length($_)>64) {
print substr($_,0,64)."\n";
$_=substr($_,64);
}
print $_."\n";
print "-----END CERTIFICATE-----\n";
}' >CA.pem

In tal modo abbiamo tutti i certificati presenti in un unico file CA.pem, purtroppo anche quelli che forse sono scaduti.
Anche se scaduti potremmo aver bisogno di verificare un file vecchio e quindi ci possono servire anche gli scaduti.
Per maggiori informazioni vedere l’articolo

Per gli aggiornamenti allo script consultare https://github.com/eniocarboni/getTrustCAP7m
Vedi tutte le FAQs

perl

Estrarre tutte le chiavi GPG pubbliche da un file

Supponiamo di avere un file di nome “file-con-chiavi-gpg” e di volerle estrarre eliminando ogni altra riga presente nel file.

perl -ne 'print if /-----BEGIN PGP PUBLIC KEY BLOCK-----/../-----END PGP PUBLIC KEY BLOCK-----/' file-con-chiavi-gpg

Naturalmente estrapolando la logica potremmo voler stampare tutte le righe comprese tra due regexp

perl -ne 'print if /regex1/../regex2/' file.txt
Vedi tutte le FAQs

Aggiungere 1 a tutti i numeri presenti su una stringa

$str =~ s/(\d+)/$1+1/ge
Vedi tutte le FAQs

Numerare un file di testo

Supponiamo di avere un file di testo (prova.txt) che vogliamo numerare. Possiamo utilizzare:

perl -pe '$_ = "$. $_"' prova.txt

Se si vuole simulare l’output di cat -n prova.txt basta usare:

perl -ne 'printf "% 5d %s", $., $_' prova.tx

Per togliere la numerazione possiamo utilizzare:

perl -pe 's/^\s*\d+\s*//' prova.txt
Vedi tutte le FAQs

Encode/decode un file o stringa in Mime Base64

Supponiamo aver una stringa “Prova encode” ed un file “prova.txt” da voler encodare in Mime base64. Per risolvere il problema possiamo semplicemente lanciare la riga di comando:

perl -MMIME::Base64 -e 'print encode_base64("Prova encode")'
perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)' prova.txt

Per l’operazione inversa basta fare:

perl -MMIME::Base64 -le 'print decode_base64("stringa in base64")'
perl -MMIME::Base64 -ne 'print decode_base64($_)' prova.base64

 

Vedi tutte le FAQs

Stampare solo la linea 25 di un file

Supponiamo di voler stampare solamente una singola linea di un file, che per comodità indichiamo con la linea 25

perl -ne '$. == 25 && print && exit' file.txt

Naturalmente se vogliamo stampare anche le righe 31 e 57

perl -ne '($. == 25 || $. == 31 || $. == 57) && print' file.txt

Mentre se volessimo tutte le righe tra la 25 e la 57  comprese

perl -ne 'print if $. >= 25 && $. <= 57' file.txt
Vedi tutte le FAQs

Rinominare un gruppo di file in base ad una regexpr

Supponiamo di voler rinominare il nome di un gruppo di file che hanno il seguente template:

file1_tmp.sh
file2_tmp.sh
...
file99_tmp.sh

e supponiamo di voler togliere la parte centrale ‘_tmp’ in tutti i file. Possiamo utilizzare il comando “rename” o “prename”:

 rename 's/_tmp//' *.sh

 

Vedi tutte le FAQs

Come contare il numero di volte che un singolo carattere è presente in ogni riga di un file

Supponiamo di avere un file di testo di nome “file.csv” e di voler contare per ogni riga il numero di volte che si presenta un carattere, ad esempio il carattere “,“.

Supponiamo che il risultato sia l’output dello stesso file “file.csv” preceduto in ogni riga dal conteggio stesso.

Basta semplicemente la seguente singola riga perl:

perl -ne '@c=$_=~/;/g; print scalar(@c)." ". $_;' file.csv

 

 

Vedi tutte le FAQs

ruby

Generazione password casuale con Ruby

Supponiamo di voler generare una password casuale, robusta ed abbastanza sicura utilizzando Ruby allora creiamo un funzione “random_password” che restituisce una password con 12 caratteri oppure se ne vogliamo una con più o meno dobbiamo passare questo valore come parametro.

Innanzi tutto definiamo il range dei caratteri ammissibili per la password

$CHARS = ('0'..'9').to_a + ('A'..'Z').to_a + ('a'..'z').to_a + ('#'..'&').to_a + (':'..'?').to_a

quindi la funzione

def random_password(length=12)
  p=''
  (0..length).each do
    p+=$CHARS[rand($CHARS.size)]
  end
  return p
end

Infine basta utilizzare la funzione appena creata per avere la password casuale:

puts random_password
puts random_password(15)
test_pwd=random_password
puts test_pwd
Vedi tutte le FAQs

ssh

ssh: come importare la chiave pubblica su un host

Supponiamo di aver già a disposizione le nostre chiavi pubbliche e private ssh o creiamole per la prima volta con il comando

ssh-keygen

Le chiavi create sono sotto $HOME/.ssh/id* e le pubbliche finiscono con .pub

Abilitare l’ssh-agent ed aggiungere le chiavi con il comando

ssh-add

Per importare la chiave sull’host “mioserver” di cui abbiamo accesso tramite l’utente “mioutente” basta il comando

ssh-copy-id mioutente@mioserver

In tal caso tutte le chiavi pubbliche vengono copiate nel server “mioserver“.
Se si vuol copiare solo la chiave “rsa” basta lanciare il comando

ssh-copy-id -i $HOME/.ssh/id_rsa mioutente@mioserver

 

Vedi tutte le FAQs

Come cambiare la password ssh

ssh-keygen -p
Vedi tutte le FAQs

Come lanciare un comando su un host remoto in ssh

Per lanciare un comando remoto basta passarlo come ultimo parametro al comando ssh.

Supponiamo ad esempio di volere la lista dei file della home page di “mioutente” su “mioserver

ssh mioutente@mioserver ls -alh

Per fare, invece,  il backup di tutta la home con il comando tar e salvare tutto in locale tramite comando ssh, lanciamo

ssh mioutente@mioserver tar czvf - . >miobackup.tgz
Vedi tutte le FAQs

Utilizzare ssh come server/proxy SOCKS5

Supponiamo di voler utilizzare “mioserver” come server/proxy SOCKS5 e configurarlo sul browser locale facciamo

ssh mioutente@mioserver
mioutente@mioserver:~$ ssh -N -D 8080 localhost

A questo punto basta configurare nel browser l’utilizzo del server “mioserver” su porta “8080” come SOCKS5 e navigare.
Aggiungere l’opzione “-f” di ssh per lasciare il comando in background.

Vedi tutte le FAQs

Come redirigere una connessione remota in locale tramite ssh

Supponiamo che l’host “mioserver” sia autorizzato ad accedere su una DMZ al server mysql della server farm, per poter accedere direttamente anche con il computer locale al server mysql possiamo lanciare il comando locale

ssh -L 3333:mysql_server_name_o_ip:3306 mioutente@mioserver

Lasciando il comando attivo ora abbiamo un canale/tunnel criptato tra il computer locale e “mioserver” sulla porta locale 3333 che si connette direttamente al server mysql in DMZ (di nome mysql_server_name_o_ip).
Possiamo quindi connetterci direttamente al server mysql con il comando

mysql -P 3333 -h 127.0.0.1 -u mioutentemysql -p miodatabasemysql

Oppure se si preferisce utilizzare phpMyAdmin basta installarlo in locale e configurarlo sulla porta locale 3333.

Per togliere il canale criptato basta chiudere la connessione ssh.

Vedi tutte le FAQs

Redirigere un servizio locale in remoto con ssh

Supponiamo di volerci connetterci da casa al pc dell’ ufficio (che può accede al server “mioserver” in server farm)  non raggiungibile nemmeno in VPN; basta che dal pc di ufficio lanciamo il comando ssh:

ssh -N -f -R 2222:localhost:22 mioutente@mioserver

lasciandolo attivo (senza spegnere il computer).
Da casa basta abilitare la VPN per poter raggiungere “mioserver” e connettersi al server

ssh mioutente@mioserver
mioutente@mioserver:~$ ssh -P 2222 utente_pc_lavoro@localhost
utente_pc_lavoro@localhost:~$

In tal modo si riesce ad entrare nel pc dell’ufficio da casa.

Vedi tutte le FAQs

wordpress

Lazy loading img con wordpress utilizzando il tema

Fino ad oggi con WordPress, senza aggiungere plugin, non è possibile avere un caricamento delle immagini di tipo “lazy” (lazy loading), ovvero in maniera asincrona cioè solo se l’immagine rientra o sta per rientrare nella viewport del browser.

Solo così i tempi di caricamento della pagina si riducono di molto e quindi è importante sia conoscere che abilitare il caricamento “lazy“.

Perché il browser carichi le immagini in modalità “lazy” bisogna utilizzare il tag html onloading=”lazy” nell’elemento “img“.

Dato che per ora non è ancora utilizzabile tramite l’editor di WordPress aggiungiamo al nostro tema (meglio se usiamo un child tema) una funzione nel file principale functions.php:

function quoll_filter_the_content( $content ) {
  // Check if we're inside the main loop in a post or page.
  if ( ( is_single() || is_page() ) && in_the_loop() && is_main_query() ) {
    // remove loading tag in img elements if exist
    $content=preg_replace('/]?)loading="[^"]"\s*/',"<img $1",$content);
    // add loading="lazy" in img elements
    return preg_replace('/<img\s+/','<img loading="lazy" ',$content);
  }
  return $content;
}
add_filter( 'the_content', 'quoll_filter_the_content', 99 );

Se necessario puliamo la cache di WordPress e controlliamo che le immagini si carichino asincronamente.

Controlliamo anche la lista dei browser che rispettano l’attributo “onloading=”lazy

Novità WordPress 5.5

Da WordPress 5.5 dovrebbe esser inglobato il lazy-loading come da articolo ufficiale.

Riferimenti

Vedi tutte le FAQs

Lazy loading plugin: img con wordpress utilizzando un plugin apposito

Come già scritto nella FAQ precedente su WordPress e su “lazy loading” per far in modo che in WordPress le immagini si carichino in maniera asincrona in base all’attuale viewport del browser non è possibile farlo tramite l’editor integrato ma bisogna utilizzare appositi temi o plugin.

Ora vediamo lo stesso funzionamento della FAQ precedente utilizzando un plugin (un lazy loading plugin) invece che scrivere una funzione direttamente nel tema.

In questo modo anche cambiando tema l’effetto “lazy” rimarrebbe.

Lazy loading plugin

Supponiamo di chiamare il plugin “quoll_img_lazy_loading” allora il file principale nella sua directory, “quoll_img_lazy_loading.php” dovrà contenere almeno il seguente codice:

function quoll_img_lazy_loading_filter_the_content( $content ) {

// Check if we're inside the main loop in a post or page.

if ( ( is_single() || is_page() ) && in_the_loop() && is_main_query() ) {

// remove loading tag in img if exist

$content=preg_replace('/<img\s+([^>]*?)loading="[^"]*"\s*/',"<img $1",$content);

// add loading="lazy" in img elements

return preg_replace('/<img\s+/','<img loading="lazy" ',$content);

}

return $content;

}

add_filter( 'the_content', 'quoll_img_lazy_loading_filter_the_content', 100 );

Naturalmente mancano le intestazioni del plugin.

Il plugin completo lo possiamo trovare su GitHub.

Se invece vogliamo utilizzare anche un po’ di javascript per rendere l’effetto “lazy” sulle immagini più compatibile con tutti i browser basta dare un occhio al progetto “quoll_img_lazy_loading_plus“.

Novità WordPress 5.5

Da WordPress 5.5 dovrebbe esser inglobato il lazy-loading come da articolo ufficiale.

Riferimenti

Vedi tutte le FAQs

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *