🔍 SEOIntermédiaire PS 1.7 PS 8.x

Obfuscation de liens PrestaShop : Smarty + JavaScript vanilla pour le SEO

Technique d'obfuscation de liens PrestaShop avec Base64, Smarty et JavaScript vanilla. Protégez votre jus SEO sans jQuery sur PrestaShop 1.7 et 8.x.

En bref : L'obfuscation de liens PrestaShop via Base64 en Smarty et JavaScript vanilla permet de contrôler la distribution du PageRank sans impacter l'expérience utilisateur. La clé technique : utiliser {assign} pour capturer les URLs générées par {url entity=...} avant d'appliquer le modifier |base64_encode, et décoder côté client avec decodeURIComponent(escape(atob())) pour supporter les caractères UTF-8.

Publié le 21 mars 2026 6 min de lecture Alexandre Carette

Pourquoi obfusquer certains liens dans PrestaShop

Le link sculpting — ou sculpture de liens — consiste à contrôler la manière dont le PageRank circule au sein d'un site. Sur une boutique PrestaShop, de nombreux liens internes n'ont aucune valeur SEO : sélecteurs de langue, liens vers la page de connexion, panier, mentions légales, etc. Chaque lien suivi par Googlebot dilue le budget de crawl et le jus de lien disponible pour les pages stratégiques (fiches produit, catégories, landing pages).

L'obfuscation consiste à remplacer les balises par des éléments non-crawlables (typiquement des ) dont l'URL est encodée en Base64 dans un attribut data-*. Un script JavaScript rétablit la navigation au clic pour l'utilisateur, tandis que les robots voient un simple texte sans lien à suivre.

Attention : Cette technique ne doit pas servir à masquer du contenu aux moteurs. Elle vise uniquement à optimiser la distribution du PageRank interne sur les pages à forte valeur.

Principe technique de l'obfuscation Base64

Le mécanisme repose sur trois étapes :

  1. **Côté serveur (Smarty)** : l'URL est encodée en Base64 via le modifier `|base64_encode` et placée dans un attribut `data-o`
  2. **Côté HTML** : un `` remplace le ``, avec une classe CSS `.l-obf` pour le styling et le ciblage JS
  3. **Côté client (JavaScript)** : au clic, le script décode le Base64 et effectue la redirection
  4. Résultat : Googlebot ne voit aucun , donc aucun lien à suivre. L'utilisateur, lui, navigue normalement.

    Implémentation Smarty dans les templates PrestaShop

    Liens simples (variables Smarty existantes)

    Pour les URLs déjà disponibles dans les variables Smarty ($urls.pages.*), l'implémentation est directe :

    
    {* Lien contact obfusqué *}
    <span class="l-obf" data-o="{$urls.pages.contact|base64_encode}">
      {l s='Contact Us' d='Shop.Theme.Global'}
    </span>
    
    {* Lien mon compte obfusqué *}
    <span class="l-obf" data-o="{$urls.pages.my_account|base64_encode}">
      {l s='Mon compte' d='Shop.Theme.Customeraccount'}
    </span>
    

    Liens générés via `{url entity=...}`

    Le tag {url} de PrestaShop 1.7+ ne peut pas être directement pipé dans un modifier Smarty. La solution est d'utiliser {assign} pour capturer l'URL dans une variable intermédiaire :

    
    {* Capturer l'URL dans une variable *}
    {assign var=linkHome value={url entity='index' controller='index' id_lang=$language.id_lang id_shop=1}}
    
    {* Utiliser la variable avec le modifier base64_encode *}
    <span data-o="{$linkHome|base64_encode}" class="l-obf dropdown-item">
      {$language.name_simple}
    </span>
    

    Cette astuce via {assign} est indispensable car Smarty ne permet pas de chaîner un modifier directement sur la sortie d'un tag de fonction. C'est une subtilité qui piège régulièrement les développeurs.

    Liens produit dynamiques

    Pour les fiches produit générées dans une boucle, on utilise la classe Link de PrestaShop :

    
    {foreach from=$products item=product}
      <span 
        data-o="{$link->getProductLink($product.id, null, $product.id_category, null, $language.id_lang)|base64_encode}" 
        class="l-obf product-link"
      >
        {$product.name}
      </span>
    {/foreach}
    

    PrestaShop 8.x : La classe Link et le modifier base64_encode fonctionnent de manière identique. En revanche, si vous migrez vers un thème basé sur Hummingbird (le nouveau thème par défaut de PS 8), vérifiez que vos overrides de templates sont bien dans le bon répertoire (themes/votre-theme/templates/).

    JavaScript vanilla pour la navigation obfusquée

    L'approche moderne se passe complètement de jQuery — une librairie qui n'a plus lieu d'être depuis l'adoption de Bootstrap 5 dans PrestaShop 8.x.

    Version de base

    
    // Obfuscation de liens — navigation au clic
    document.querySelectorAll('.l-obf').forEach(function(el) {
      el.style.cursor = 'pointer';
      el.addEventListener('click', function() {
        window.location.href = atob(this.dataset.o);
      });
    });
    

    Version robuste avec support UTF-8

    Les URLs contenant des caractères accentués ou spéciaux (fréquent avec les slugs français) nécessitent un décodage supplémentaire. En effet, atob() ne gère pas nativement l'UTF-8 — il faut passer par escape() puis decodeURIComponent() :

    
    // Obfuscation de liens — support complet UTF-8
    document.querySelectorAll('.l-obf').forEach(function(el) {
      el.style.cursor = 'pointer';
      
      el.addEventListener('click', function(e) {
        e.preventDefault();
        try {
          var decoded = atob(this.dataset.o);
          // Décodage UTF-8 pour les URLs avec accents
          window.location.href = decodeURIComponent(escape(decoded));
        } catch (err) {
          console.error('Erreur décodage lien obfusqué:', err);
        }
      });
    });
    

    Version moderne ES6+ (PrestaShop 8.x)

    Sur PrestaShop 8.x, le support navigateur permet d'utiliser une syntaxe moderne plus concise :

    
    // Obfuscation de liens — ES6+
    document.addEventListener('DOMContentLoaded', () => {
      document.querySelectorAll('.l-obf').forEach(el => {
        el.style.cursor = 'pointer';
        el.setAttribute('role', 'link');
        
        el.addEventListener('click', () => {
          try {
            const decoded = atob(el.dataset.o);
            window.location.href = decodeURIComponent(escape(decoded));
          } catch (e) {
            console.warn('[obf] URL invalide:', e.message);
          }
        });
    
        // Support clavier pour l'accessibilité
        el.addEventListener('keydown', (e) => {
          if (e.key === 'Enter' || e.key === ' ') {
            e.preventDefault();
            el.click();
          }
        });
    
        el.setAttribute('tabindex', '0');
      });
    });
    

    Styling CSS pour les liens obfusqués

    Les obfusqués doivent rester visuellement identiques aux liens classiques pour ne pas dégrader l'expérience utilisateur :

    
    .l-obf {
      cursor: pointer;
      color: var(--link-color, #2563eb);
      text-decoration: underline;
      transition: color 0.2s ease;
    }
    
    .l-obf:hover {
      color: var(--link-hover-color, #1d4ed8);
    }
    
    .l-obf:focus-visible {
      outline: 2px solid var(--focus-color, #3b82f6);
      outline-offset: 2px;
      border-radius: 2px;
    }
    

    Bonnes pratiques et pièges à éviter

    Ce qu'il faut obfusquer

    • Sélecteurs de langue et de devise
    • Liens de connexion / inscription / panier
    • Mentions légales, CGV, politique de confidentialité
    • Liens de pagination (dans certains cas)
    • Liens vers les réseaux sociaux dans le footer

    Ce qu'il ne faut PAS obfusquer

    • Liens de navigation principale (catégories, sous-catégories)
    • Liens vers les fiches produit depuis les listings
    • Liens du fil d'Ariane (breadcrumb)
    • Liens internes dans le contenu éditorial (articles, descriptions)

    Pièges courants

    1. **Oublier le décodage UTF-8** : sans `decodeURIComponent(escape(...))`, les URLs avec accents provoquent une erreur ou redirigent vers une 404
    2. **Ne pas ajouter `cursor: pointer`** : l'utilisateur ne comprend pas que l'élément est cliquable
    3. **Ignorer l'accessibilité** : sans `tabindex` et gestion du clavier, les utilisateurs naviguant au clavier sont bloqués
    4. **Sur-obfusquer** : masquer les liens stratégiques nuit au SEO au lieu de l'améliorer
    5. **Oublier le `{assign}`** : tenter de piper directement `{url entity=...}|base64_encode` ne fonctionne pas en Smarty
    6. Vérifier que l'obfuscation fonctionne

      Pour confirmer que Googlebot ne voit plus les liens obfusqués :

      1. **Inspection du code source** : vérifiez qu'aucun `` n'apparaît pour les liens ciblés
      2. **Google Search Console** : dans l'outil d'inspection d'URL, vérifiez le HTML rendu — les `` ne doivent pas être transformés en liens
      3. **Screaming Frog** : lancez un crawl en mode "JavaScript rendering" et comparez le nombre de liens détectés avec et sans exécution JS
      4. **Test manuel** : désactivez JavaScript dans votre navigateur et confirmez que les éléments obfusqués ne sont pas cliquables

Questions fréquentes

Tout ce que vous devez savoir sur ce sujet.

Alexandre Carette

Alexandre Carette

Expert PrestaShop & Architecture E-commerce

Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.