Salta al contenuto

Ti risponde Salvatore, di persona: niente centralini, niente ticket.

Liquid di Shopify: guida pratica per chi parte da zero

Copertina: Liquid di Shopify, guida pratica per chi parte da zero, con una finestra di codice Liquid

Se hai mai aperto “Modifica codice” nel tuo negozio, hai visto file pieni di parentesi graffe e di simboli di percentuale. Quello è Liquid, il linguaggio con cui sono scritti tutti i temi: capire Liquid Shopify è il primo passo per leggere un tema senza paura.

In breve: Liquid è il linguaggio di template di Shopify. Prende i dati del negozio (prodotti, collezioni, carrello, impostazioni del tema) e li trasforma nell’HTML che vede il cliente. Si basa su tre cose: gli oggetti, cioè i dati; i tag, cioè la logica; i filtri, che trasformano quello che stampi.

In questa guida ti spiego queste tre cose con esempi corti, presi dal lavoro di tutti i giorni sui temi. Ogni pezzo di codice segue la documentazione ufficiale attuale di Shopify. Se arrivi da WordPress e PHP ti troverai a casa in fretta; se non hai mai scritto codice, ti basta sapere leggere un file di testo.

Cos’è Liquid e dove si trova nel tema

Liquid è un linguaggio creato da Shopify e rilasciato come progetto open source. Shopify ne usa una versione arricchita, con oggetti e filtri pensati per l’e-commerce, descritti nella documentazione di riferimento di Liquid.

Il codice viene eseguito sui server di Shopify, prima che la pagina arrivi al browser. Per questo non puoi usare PHP: il negozio non è un server tuo, e Liquid è l’unico modo per “parlare” con i dati del tema. Se ti serve un ripasso su come funziona la piattaforma, parti da cos’è Shopify e come funziona per l’e-commerce.

Nel tema trovi Liquid in queste cartelle:

  • layout/: la cornice di tutte le pagine, di solito theme.liquid;
  • sections/: i “mattoni” che sposti dall’editor del tema (banner, prodotti in evidenza, testo con immagine);
  • blocks/: nei temi più recenti, i blocchi riutilizzabili dentro le sezioni;
  • snippets/: pezzi di codice richiamati da altri file;
  • templates/: nei temi Online Store 2.0 sono quasi tutti file JSON, cioè l’elenco delle sezioni che compaiono in una pagina.

Le cartelle config/ e locales/ contengono invece file JSON: impostazioni del tema e traduzioni dei testi.

Le due “parentesi”: output e logica

In Liquid ci sono solo due tipi di delimitatori da ricordare. Tutto il resto del file è HTML normale.

{{ }} per stampare

Le doppie graffe stampano un valore nella pagina. {{ product.title }} scrive il nome del prodotto; {{ product.price | money }} scrive il prezzo formattato nella valuta del negozio. Il simbolo | applica un filtro: ne parlo più sotto.

{% %} per decidere

Graffa e percentuale servono alla logica: condizioni, cicli, variabili. Non stampano niente da sole. Ecco un esempio che uso spesso per spiegare Liquid ai clienti: titolo del prodotto, poi prezzo o scritta “Esaurito”.

sections/main-product.liquid (estratto)

<h1 class="titolo-prodotto">{{ product.title | escape }}</h1>
{%- if product.available -%}
  <p class="prezzo">{{ product.price | money }}</p>
{%- else -%}
  <p class="prezzo">Esaurito</p>
{%- endif -%}

Riga per riga: la prima stampa il titolo, con il filtro escape che neutralizza eventuali caratteri HTML. La seconda controlla se almeno una variante è disponibile. La terza stampa il prezzo più basso tra le varianti. Il ramo else gestisce il prodotto esaurito, e endif chiude la condizione.

Esempio di codice Liquid con output, condizione e filtro money in una pagina prodotto Shopify
Output, condizione e filtro money: le tre cose che trovi in ogni file Liquid.

Il trattino che toglie gli spazi

Hai notato {%- e -%}? Il trattino toglie gli spazi e gli a capo che Liquid lascerebbe nell’HTML al posto del tag. Vale anche per l’output: {{- valore -}}. Non cambia cosa vede il cliente, ma tiene pulito il codice della pagina. Io lo metto sempre sui tag di logica.

Due tag utili per tenere ordine: {% comment %}…{% endcomment %} per i commenti, che non finiscono nella pagina, e {% liquid %}, che permette di scrivere più istruzioni di fila senza ripetere le parentesi.

Gli oggetti che userai sempre

Un oggetto è un contenitore di dati. Le sue proprietà si leggono con il punto: product.title, cart.item_count. Alcuni oggetti sono globali e li trovi ovunque (shop, cart, settings, request); altri esistono solo in certe pagine, come product nella pagina prodotto. L’elenco completo è nella pagina degli oggetti Liquid.

Gli oggetti Liquid più usati nei temi Shopify e a cosa servono: product, collection, cart, customer, shop, section, block, settings
Gli otto oggetti Liquid che trovi in quasi tutti i temi.

product e variant

product contiene titolo, descrizione, immagini, prezzi e varianti. Una cosa che spiazza chi arriva da WordPress: i prezzi sono numeri interi nella sottounità della valuta. Un prodotto da 49,00 € vale 4900: per mostrarlo come prezzo serve il filtro money. Quando alla scheda prodotto servono dati che Shopify non prevede, come il materiale o i tempi di consegna, uso i metafield e i metaobject.

Le varianti (taglia, colore) sono oggetti variant. Per lavorare su quella scelta dal cliente, o sulla prima disponibile, uso product.selected_or_first_available_variant:

{%- assign variante = product.selected_or_first_available_variant -%}
<p>{{ variante.title }}: {{ variante.price | money }}</p>

collection

Nella pagina di una collezione hai collection, con collection.title e l’elenco collection.products. Attenzione: nella pagina prodotto collection c’è solo se il cliente è arrivato da un indirizzo del tipo /collections/scarpe/products/sneaker-bianca. Se apre /products/sneaker-bianca, l’oggetto è vuoto.

cart

cart è il carrello del visitatore ed è disponibile in tutte le pagine: cart.item_count dà il numero di articoli, cart.total_price il totale dopo gli sconti, sempre in centesimi.

section, block e settings

Qui c’è il cuore dei temi moderni. section.settings contiene i valori che il titolare imposta nell’editor per quella sezione; section.blocks è l’elenco dei suoi blocchi, ognuno con i propri block.settings. settings, da solo, contiene le impostazioni generali del tema (colori, caratteri, logo).

sections/vantaggi.liquid (estratto)

{%- for block in section.blocks -%}
  <div class="vantaggio" {{ block.shopify_attributes }}>
    {{ block.settings.testo }}
  </div>
{%- endfor -%}

block.shopify_attributes aggiunge gli attributi che servono all’editor del tema per riconoscere il blocco quando ci clicchi sopra. Fuori dall’editor non stampa niente.

Tag: condizioni, cicli e snippet

I tag sono le istruzioni tra {% %}. L’elenco completo è nella pagina dei tag Liquid; questi sono quelli che uso ogni giorno.

if, unless, case

if esegue un blocco se la condizione è vera, unless se è falsa. Gli operatori sono ==, !=, >, <, >=, <=, contains, più and e or. Due regole da sapere: le parentesi tonde non sono ammesse, e le condizioni multiple si valutano da destra verso sinistra.

Altra regola che fa perdere ore: in Liquid sono “falsi” solo nil e false. Una stringa vuota è vera. Per controllare se un testo è stato compilato usa != blank, come spiega la pagina sulle basi di Liquid.

Quando le possibilità sono tante, case è più leggibile di una catena di if:

{%- case product.type -%}
  {%- when 'Scarpe' -%}
    {% render 'guida-taglie-scarpe' %}
  {%- when 'Maglie', 'Felpe' -%}
    {% render 'guida-taglie-maglie' %}
  {%- else -%}
    <p>Scrivici per sapere le misure.</p>
{%- endcase -%}

for e paginate

for ripete un blocco per ogni elemento di un elenco. Su Shopify un ciclo fa al massimo 50 giri: per elenchi più lunghi, come i prodotti di una collezione, si usa paginate, che divide l’elenco in pagine da 1 a 250 elementi.

sections/main-collection.liquid (estratto)

{%- paginate collection.products by 24 -%}
  {%- for product in collection.products -%}
    <a href="{{ product.url }}">{{ product.title | escape }}</a>
  {%- else -%}
    <p>Nessun prodotto in questa collezione.</p>
  {%- endfor -%}
  {{- paginate | default_pagination -}}
{%- endpaginate -%}

Il ramo else dentro for si esegue quando l’elenco è vuoto. default_pagination stampa i link alle pagine successive come veri link HTML, una cosa utile anche per Google.

render (e perché non include)

render inserisce uno snippet, cioè un file della cartella snippets/. Lo snippet non vede le variabili create fuori: quello che gli serve glielo passi tu come parametro.

{% render 'card-prodotto', product: product, mostra_prezzo: true %}
{% render 'card-prodotto' for collection.products as product %}

Nei tutorial vecchi trovi ancora {% include %}: Shopify lo ha deprecato perché il modo in cui condivide le variabili rallenta le pagine e rende il codice difficile da seguire. Nei file nuovi usa sempre render.

Filtri: i 10 più utili

Un filtro trasforma il valore che lo precede, e i filtri si concatenano da sinistra a destra. Questi sono i dieci che uso di più; gli altri sono nella pagina dei filtri Liquid.

  1. money: formatta un prezzo nella valuta del cliente (money_with_currency aggiunge il codice, es. EUR);
  2. image_url: crea l’indirizzo di un’immagine alla misura che chiedi (sostituisce il vecchio img_url, deprecato);
  3. image_tag: crea il tag <img> completo a partire da image_url;
  4. t: prende un testo dai file di traduzione in locales/;
  5. escape: rende sicuro un testo dentro l’HTML;
  6. default: usa un valore di riserva se quello principale è vuoto;
  7. date: formatta una data;
  8. strip_html: toglie i tag HTML, per esempio dalla descrizione del prodotto;
  9. truncate: accorcia un testo a un numero di caratteri;
  10. json: trasforma un valore in JSON valido, indispensabile quando passi dati a JavaScript o scrivi dati strutturati.
{{ product.featured_image | image_url: width: 800 | image_tag: loading: 'lazy' }}
{{ product.description | strip_html | truncate: 140 }}
{{ article.published_at | date: format: 'abbreviated_date' }}
{{ section.settings.titolo | default: 'Novità' | escape }}
{{ 'products.product.add_to_cart' | t }}

Ci sono anche i filtri matematici plus, minus, times e divided_by. Occhio a divided_by: tra numeri interi il risultato è intero, quindi {{ 7 | divided_by: 2 }} dà 3. Se ti servono i decimali dividi per 2.0.

Gli errori più comuni

Quando metto le mani su un tema modificato da altri, gli errori sono quasi sempre gli stessi. Eccoli, così li eviti dall’inizio.

  • Tag non chiusi: un if senza endif o un for senza endfor. L’editor del codice ti segnala l’errore di sintassi: leggilo, indica la riga.
  • Prezzi senza filtro: {{ product.price }} stampa 4900, non 49,00 €.
  • Testi vuoti trattati come falsi: {% if section.settings.titolo %} è vero anche con il campo vuoto; usa != blank.
  • Codice copiato da guide vecchie: include, img_url e i template .liquid al posto dei JSON sono segnali di un tutorial superato.
  • Variabili che “spariscono” negli snippet: con render vanno passate come parametri.
  • Modifiche fatte sul tema pubblicato: un errore lo vedono subito i clienti. Si lavora sempre su una copia del tema.

Il mio consiglio: prima di toccare qualsiasi file, duplica il tema da Negozio online > Temi. Fai le prove sulla copia, guardale in anteprima e pubblica solo quando è tutto a posto.

Domande frequenti

Liquid è difficile da imparare?

No, per le basi bastano pochi giorni. Le regole sono poche: doppie graffe per stampare, graffa e percentuale per la logica, filtri per trasformare i valori. La parte che richiede più tempo è conoscere gli oggetti di Shopify e la struttura del tema che stai modificando, perché ogni tema organizza sezioni e snippet a modo suo.

Posso usare PHP o JavaScript al posto di Liquid?

PHP no: il tema gira sui server di Shopify e accetta solo Liquid. JavaScript sì, ma lavora nel browser, dopo che la pagina è stata generata, e serve per interazioni come il carrello che si aggiorna senza ricaricare. I dati del negozio arrivano nella pagina sempre tramite Liquid, che li stampa nell’HTML.

Dove trovo l’elenco completo di oggetti e filtri?

Nella documentazione ufficiale su shopify.dev, sezione Liquid: ci sono pagine separate per oggetti, tag e filtri, con esempi e note sulle funzioni deprecate. È l’unica fonte che consiglio, perché i tutorial in giro spesso usano sintassi superata come include o img_url, che oggi non andrebbero più usate.

Se sbaglio il codice si rompe il negozio?

Può succedere, se modifichi il tema pubblicato. Per questo si lavora su una copia: duplichi il tema, fai le modifiche, controlli l’anteprima e pubblichi solo alla fine. L’editor segnala gli errori di sintassi e ogni file ha una cronologia per tornare a una versione precedente. Gli ordini e i prodotti non vengono toccati dal codice del tema.

Conclusione

Liquid si legge in fretta: oggetti per i dati, tag per la logica, filtri per trasformare. Con queste tre idee apri qualsiasi file del tema e capisci cosa sta facendo. Il passo successivo è provare piccole modifiche su una copia del tema, con calma.

Quando la modifica è più grande, come una sezione nuova o un tema su misura, è il lavoro che faccio nella realizzazione e migrazione di negozi Shopify; per le correzioni continue c’è l’assistenza e manutenzione del negozio online.

Vuoi una modifica al tema ma non hai tempo di imparare Liquid? Scrivimi cosa ti serve: ti rispondo io.

Scritto da

Salvatore Pitone

Sviluppatore web, realizzo siti WordPress ed e-commerce per professionisti e piccole imprese. Sul blog condivido quello che imparo ogni giorno lavorando sui siti dei miei clienti.

Richiedi un preventivo

Preventivo gratuito

Partiamo dal tuo progetto, con calma e chiarezza.

Scrivimi cosa ti serve. Ti richiamo io, ti faccio qualche domanda e ti mando un preventivo chiaro, senza sorprese e senza tecnicismi.

Salvatore Pitone, sviluppatore web, sorridente con le braccia incrociate
Ti rispondo io, Salvatore. Niente call center: leggo personalmente ogni richiesta e ti rispondo entro 24 ore lavorative.

Raccontami il tuo progetto

Ti rispondo personalmente entro 24 ore lavorative.