Tutos & formations
Débogage Liquid

Débogage Liquid


Guide pour identifier, comprendre et résoudre les problèmes courants dans le code Liquid de votre thème Shopify.

Vue d'ensemble

Le débogage Liquid permet de :

  • Identifier les erreurs de syntaxe
  • Comprendre pourquoi des données ne s'affichent pas
  • Optimiser les performances
  • Vérifier la logique conditionnelle
  • Tracer le flux de données

Outils de débogage

1. Console Liquid dans l'éditeur de thème

L'éditeur de thème Shopify offre une console pour tester le code Liquid :

  1. Aller dans En ligneThèmesPersonnaliser
  2. Cliquer sur "..."Thème éditeur de code
  3. Utiliser la console pour tester des expressions Liquid

2. Extension VS Code

Shopify Liquid

Extension officielle pour VS Code :

  • Syntaxe highlighting
  • Autocomplétion
  • Validation de syntaxe
  • Snippets utiles

Installation :

code --install-extension shopify.liquid

3. Outils en ligne

Liquid Parser

Techniques de débogage

1. Affichage de valeurs avec {{ }}

La méthode la plus simple pour voir la valeur d'une variable :

{% comment %} Afficher une variable {% endcomment %}
{{ product.title }}
 
{% comment %} Afficher plusieurs valeurs {% endcomment %}
Produit: {{ product.title }}
Prix: {{ product.price | money }}
ID: {{ product.id }}

2. Debug avec inspect

Le filtre inspect affiche la structure complète d'un objet :

{% comment %} Afficher toutes les propriétés d'un produit {% endcomment %}
{{ product | inspect }}
 
{% comment %} Afficher les propriétés d'une collection {% endcomment %}
{{ collection | inspect }}
 
{% comment %} Afficher les settings d'une section {% endcomment %}
{{ section.settings | inspect }}

Exemple de sortie :

{"id":123456,"title":"Produit","handle":"produit","vendor":"Marque",...}

3. Vérifier si une variable existe

{% comment %} Vérifier si une variable est définie {% endcomment %}
{% if product %}
  Le produit existe : {{ product.title }}
{% else %}
  Le produit n'existe pas
{% endif %}
 
{% comment %} Vérifier si une propriété existe {% endcomment %}
{% if product.metafields.custom.field %}
  Metafield existe : {{ product.metafields.custom.field }}
{% else %}
  Metafield n'existe pas
{% endif %}

4. Vérifier si une valeur est vide

{% comment %} Vérifier si une valeur est vide {% endcomment %}
{% if product.description != blank %}
  Description : {{ product.description }}
{% else %}
  Pas de description
{% endif %}
 
{% comment %} Alternative avec unless {% endcomment %}
{% unless product.description == blank %}
  Description : {{ product.description }}
{% endunless %}

5. Compteur de boucles

Pour déboguer les boucles, afficher l'index :

{% for product in collection.products %}
  {% comment %} Afficher l'index et le produit {% endcomment %}
  Index: {{ forloop.index }} - {{ product.title }}
  
  {% comment %} Vérifier si c'est le premier ou dernier {% endcomment %}
  {% if forloop.first %}
    Premier produit
  {% endif %}
  
  {% if forloop.last %}
    Dernier produit
  {% endif %}
{% endfor %}

6. Limiter les boucles pour le debug

Limiter le nombre d'itérations pour tester :

{% comment %} Limiter à 3 produits pour le debug {% endcomment %}
{% assign limit = 3 %}
{% for product in collection.products limit: limit %}
  {{ product.title }}
{% endfor %}

Problèmes courants et solutions

1. Variable non définie ou vide

Problème : Variable retourne vide

{% comment %} ❌ Problème {% endcomment %}
{{ product.custom_field }}

Solution :

{% comment %} ✅ Vérifier d'abord si la variable existe {% endcomment %}
{% if product.custom_field != blank %}
  {{ product.custom_field }}
{% else %}
  Valeur par défaut ou message d'erreur
{% endif %}
 
{% comment %} ✅ Utiliser assign avec une valeur par défaut {% endcomment %}
{% assign custom_field = product.custom_field | default: 'Valeur par défaut' %}
{{ custom_field }}

2. Erreurs de syntaxe dans les conditions

Problème : Condition ne fonctionne pas

{% comment %} ❌ Problème : comparaison incorrecte {% endcomment %}
{% if product.price == 0 %}
  Gratuit
{% endif %}

Solution :

{% comment %} ✅ Utiliser les bonnes comparaisons {% endcomment %}
{% if product.price == 0 %}
  Gratuit
{% elsif product.compare_at_price > product.price %}
  En promotion
{% endif %}
 
{% comment %} ✅ Pour les strings {% endcomment %}
{% if product.vendor == "Nike" %}
  Produit Nike
{% endif %}
 
{% comment %} ✅ Vérifier si contient {% endcomment %}
{% if product.tags contains "nouveau" %}
  Nouveau produit
{% endif %}

3. Problèmes avec les filtres

Problème : Filtre ne fonctionne pas comme attendu

{% comment %} ❌ Problème : format incorrect {% endcomment %}
{{ product.price | money }}

Solution :

{% comment %} ✅ Vérifier les paramètres du filtre {% endcomment %}
{{ product.price | money }}
 
{% comment %} ✅ Avec paramètres {% endcomment %}
{{ product.price | money_with_currency }}
 
{% comment %} ✅ Debug : voir la valeur avant filtre {% endcomment %}
Prix brut: {{ product.price }}
Prix formaté: {{ product.price | money }}
 
{% comment %} ✅ Tester différents formats {% endcomment %}
{{ product.price | divided_by: 100.0 | round: 2 }}

4. Problèmes avec les boucles

Problème : Boucle ne s'exécute pas

{% comment %} ❌ Problème : collection vide {% endcomment %}
{% for product in collection.products %}
  {{ product.title }}
{% endfor %}

Solution :

{% comment %} ✅ Vérifier si la collection existe et a des produits {% endcomment %}
{% if collection.products.size > 0 %}
  {% for product in collection.products %}
    {{ product.title }}
  {% endfor %}
{% else %}
  Aucun produit dans cette collection
{% endif %}
 
{% comment %} ✅ Debug : afficher la taille {% endcomment %}
Nombre de produits: {{ collection.products.size }}
 
{% comment %} ✅ Vérifier la collection {% endcomment %}
{{ collection | inspect }}

5. Problèmes avec les metafields

Problème : Metafield ne s'affiche pas

{% comment %} ❌ Problème : chemin incorrect {% endcomment %}
{{ product.metafields.custom.color }}

Solution :

{% comment %} ✅ Debug : voir la structure complète {% endcomment %}
{{ product.metafields | inspect }}
 
{% comment %} ✅ Vérifier le namespace et la clé {% endcomment %}
{% if product.metafields.custom.color %}
  {{ product.metafields.custom.color }}
{% endif %}
 
{% comment %} ✅ Afficher tous les metafields custom {% endcomment %}
{% for metafield in product.metafields.custom %}
  {{ metafield[0] }}: {{ metafield[1] }}
{% endfor %}

6. Problèmes avec les sections et blocks

Problème : Block ne s'affiche pas

{% comment %} ❌ Problème : block non vérifié {% endcomment %}
{% for block in section.blocks %}
  {{ block.settings.text }}
{% endfor %}

Solution :

{% comment %} ✅ Vérifier le type de block {% endcomment %}
{% for block in section.blocks %}
  {% case block.type %}
    {% when 'text' %}
      {{ block.settings.text }}
    {% when 'image' %}
      <img src="{{ block.settings.image | image_url }}" alt="{{ block.settings.alt }}">
  {% endcase %}
{% endfor %}
 
{% comment %} ✅ Debug : afficher tous les blocks {% endcomment %}
{% for block in section.blocks %}
  Block type: {{ block.type }}
  Block settings: {{ block.settings | inspect }}
{% endfor %}

Techniques avancées

1. Créer un snippet de debug

Créer snippets/debug.liquid :

{% comment %}
  Snippet de debug pour afficher des informations
  
  Usage:
  {% render 'debug', variable: product, label: 'Product' %}
{% endcomment %}
 
{% if variable != blank %}
  <div class="debug-info" style="background: #f0f0f0; padding: 1rem; margin: 1rem 0; border-left: 4px solid #007bff;">
    <strong>{{ label | default: 'Debug' }}:</strong>
    <pre style="margin: 0.5rem 0; overflow: auto;">{{ variable | inspect }}</pre>
  </div>
{% else %}
  <div class="debug-info" style="background: #fff3cd; padding: 1rem; margin: 1rem 0; border-left: 4px solid #ffc107;">
    <strong>{{ label | default: 'Debug' }}:</strong> Variable vide ou non définie
  </div>
{% endif %}

Utilisation :

{% render 'debug', variable: product, label: 'Product Info' %}
{% render 'debug', variable: collection, label: 'Collection Info' %}

2. Mode debug conditionnel

Créer un setting pour activer/désactiver le debug :

{% comment %} Dans le schema de la section {% endcomment %}
{
  "type": "checkbox",
  "id": "enable_debug",
  "label": "Activer le mode debug",
  "default": false
}
 
{% comment %} Dans le code Liquid {% endcomment %}
{% if section.settings.enable_debug %}
  <div class="debug-mode">
    {{ product | inspect }}
    {{ collection | inspect }}
  </div>
{% endif %}

3. Logger les valeurs dans la console

Pour les valeurs complexes, utiliser JavaScript :

<script>
  console.log('Product Data:', {
    id: {{ product.id | json }},
    title: {{ product.title | json }},
    price: {{ product.price | json }},
    variants: {{ product.variants | json }}
  });
</script>

4. Afficher les chemins de fichiers

Pour déboguer les inclusions de snippets :

{% comment %} Vérifier si un snippet existe {% endcomment %}
{% if snippets['mm-product-card'] %}
  Snippet existe
{% else %}
  Snippet n'existe pas
{% endif %}

Checklist de débogage

Avant de commencer

  • Vérifier la syntaxe Liquid (pas d'erreurs dans l'éditeur)
  • Vérifier que les fichiers sont sauvegardés
  • Vider le cache du navigateur
  • Vérifier la console du navigateur pour les erreurs JS

Étapes de débogage

  1. Identifier le problème

    • Qu'est-ce qui ne fonctionne pas ?
    • Quand est-ce que ça se produit ?
    • Sur quelle page/section ?
  2. Isoler le code

    • Simplifier le code au maximum
    • Tester avec des valeurs hardcodées
    • Vérifier chaque variable individuellement
  3. Vérifier les données

    • Les données existent-elles ?
    • Les données ont-elles le bon format ?
    • Les données sont-elles accessibles ?
  4. Tester les conditions

    • Les conditions sont-elles correctes ?
    • Les opérateurs de comparaison sont-ils bons ?
    • Les valeurs par défaut sont-elles définies ?
  5. Vérifier les filtres

    • Le filtre est-il correctement utilisé ?
    • Les paramètres du filtre sont-ils bons ?
    • Y a-t-il une alternative au filtre ?

Erreurs courantes et solutions rapides

Erreur : "Liquid syntax error"

Causes possibles :

  • Balises non fermées : {% if %} sans {% endif %}
  • Filtres mal formés : | filter param au lieu de | filter: param
  • Variables mal référencées

Solution : Vérifier la syntaxe avec un validateur Liquid

Erreur : Variable retourne null ou vide

Causes possibles :

  • Variable non définie dans le contexte
  • Chemin incorrect (ex: product.custom au lieu de product.metafields.custom)
  • Données non disponibles pour l'objet

Solution : Utiliser inspect pour voir la structure, vérifier le contexte

Erreur : Boucle infinie ou très lente

Causes possibles :

  • Boucle sans limite sur une grande collection
  • Récursion dans les snippets
  • Trop de produits chargés

Solution : Ajouter des limites, utiliser la pagination

Ressources