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

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.

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.
money: formatta un prezzo nella valuta del cliente (money_with_currencyaggiunge il codice, es. EUR);image_url: crea l’indirizzo di un’immagine alla misura che chiedi (sostituisce il vecchioimg_url, deprecato);image_tag: crea il tag<img>completo a partire daimage_url;t: prende un testo dai file di traduzione inlocales/;escape: rende sicuro un testo dentro l’HTML;default: usa un valore di riserva se quello principale è vuoto;date: formatta una data;strip_html: toglie i tag HTML, per esempio dalla descrizione del prodotto;truncate: accorcia un testo a un numero di caratteri;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
ifsenzaendifo unforsenzaendfor. 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_urle i template.liquidal posto dei JSON sono segnali di un tutorial superato. - Variabili che “spariscono” negli snippet: con
rendervanno 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
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.




