Langage de gabarit
Une syntaxe volontairement limitée : tout est échappé par défaut, aucune fonction PHP n'est accessible, les boucles et les inclusions sont bornées.
{{ product.name }} variable (échappée)
{{ product.price | money }} filtre
{{ settings.hero_title | default: shop.name }}
{{ products[0].name }} {{ product["name"] }}
{% if product.on_sale and product.in_stock %} … {% elsif x > 2 %} … {% else %} … {% endif %}
{% unless customer %} … {% endunless %}
{% for p in products %}{{ loop.index }}/{{ loop.length }} {{ p.name }}{% else %}Aucun produit{% endfor %}
{% set total = p.price | times: 2 %}
{% include "carte-produit" with product: p %}
{% section "banniere" %}
{# commentaire #} {% raw %}{{ pas interprété }}{% endraw %}
{{- … -}} {%- … -%} retire les espaces autourOpérateurs
== != < > <= >= contains and or not — liste.size, liste.first, liste.last.
Filtres
| Filtre | Rôle | Exemple |
|---|---|---|
money | Prix en euros à partir de centimes | {{ product.price | money }} → 12,90 € |
raw | Affiche sans échappement (HTML déjà nettoyé par le cœur) | {{ page.body | raw }} |
escape | Échappe (déjà fait par défaut) | {{ texte | escape }} |
default | Valeur de secours si vide | {{ settings.hero_title | default: shop.name }} |
upcase | Majuscules | {{ "pain" | upcase }} → PAIN |
downcase | Minuscules | {{ "PAIN" | downcase }} → pain |
capitalize | Première lettre en majuscule | {{ "pain" | capitalize }} → Pain |
truncate | Coupe à N caractères | {{ product.description | truncate: 80, "…" }} |
strip_html | Retire les balises HTML | {{ page.body | strip_html }} |
newline_to_br | Retours à la ligne en <br> | {{ product.description | newline_to_br }} |
date | Date formatée (format PHP) | {{ order.created_at | date: "d/m/Y" }} → 30/10/2026 |
size | Nombre d'éléments ou de caractères | {{ products | size }} → 12 |
join | Assemble une liste | {{ tags | join: ", " }} → bio, levain |
first | Premier élément | {{ product.images | first }} |
last | Dernier élément | {{ breadcrumbs | last }} |
limit | N éléments (à partir d'un décalage) | {% for p in products | limit: 4, 0 %} |
reverse | Inverse une liste | {% for p in products | reverse %} |
where | Garde les éléments dont la clé est vraie (ou égale) | {{ products | where: "on_sale" }} |
map | Extrait une clé de chaque élément | {{ menu | map: "name" | join: " · " }} |
append | Ajoute à la fin | {{ "Pain" | append: " bio" }} → Pain bio |
prepend | Ajoute au début | {{ "bio" | prepend: "Pain " }} → Pain bio |
replace | Remplace un texte | {{ phone | replace: " ", "" }} |
plus | Addition | {{ 2 | plus: 3 }} → 5 |
minus | Soustraction | {{ 5 | minus: 2 }} → 3 |
times | Multiplication | {{ 2 | times: 3 }} → 6 |
divided_by | Division (0 si division par zéro) | {{ 7 | divided_by: 2 }} → 3.5 |
round | Arrondi | {{ 3.14159 | round: 2 }} → 3.14 |
pluralize | Singulier ou pluriel selon le nombre | {{ n | pluralize: "produit", "produits" }} |
url_encode | Encode pour une adresse | {{ q | url_encode }} |
json | JSON sûr dans un <script> | {{ product.variants | json }} |
handle | Identifiant d'URL | {{ "Pâtisseries fines" | handle }} → patisseries-fines |
asset_url | Adresse d'un fichier du dossier assets/ (versionnée) | {{ "theme.css" | asset_url }} |
Limites
- 20 000 itérations de boucle par page, 12 inclusions imbriquées, 4 Mo de HTML.
- Une erreur de syntaxe affiche « boutique momentanément indisponible » : testez chaque page.