Publié le 5 mars 2026 SEO Technique

Mots-clés LSI Latent Semantic Indexing

Sommaire de l'article

Recherche de mots-clés LSI : mots-clés sémantiquement liés et types

Introduction

La recherche de mots-clés est uneétape cruciale dans toute stratégie SEO. Parmi les approches possibles, les mots-clés LSI (pour Latent Semantic Indexing ou indexation sémantique latente) et, plus largement, les mots-clés sémantiquement liés occupent une place importante dans la rédaction de contenus optimisés. Ils permettent d’enrichir le champ lexical, de clarifier le contexte d’une page et d’améliorer sa pertinence aux yeux des moteurs de recherche et des utilisateurs. Dans cet article, nous allons expliquer en détail ce que sont réellement les mots-clés LSI, comment comprendre la notion de « mot-clé sémantiquement lié », quels sont les principaux types de mots-clés, et comment les intégrer de manière efficace et naturelle dans votre stratégie de référencement.

Clarification sur le concept de LSI et limites du terme en SEO

Avant d’aller plus loin, il est important de distinguer le concept technique de LSI de l’usage courant du terme en SEO. Historiquement, l’indexation sémantique latente est une méthode mathématique de traitement du langage naturel, développée à la fin des années 1980, qui repose notamment sur la décomposition en valeurs singulières pour identifier les relations entre termes et documents. Cette technique permet de regrouper des textes par similarité thématique, même si les mêmes mots ne sont pas explicitement utilisés.

En SEO moderne, le terme « mots-clés LSI » est utilisé de façon plus large pour désigner des mots et expressions sémantiquement liés au mot-clé principal : ce sont des termes qui appartiennent au même univers thématique, qui apparaissent fréquemment ensemble ou qui aident à préciser l’intention de recherche. Il ne s’agit pas forcément de synonymes, mais plutôt de cooccurrences, de concepts associés ou de sous-thèmes pertinents. Même si les moteurs de recherche actuels (comme Google) ne confirment pas utiliser strictement l’algorithme LSI originel, la logique sous-jacente reste valable : plus un contenu est riche sémantiquement, mieux il peut répondre à une requête complexe.

Définitions des principaux concepts

Pour bien comprendre comment utiliser les mots-clés sémantiquement liés, il est utile de clarifier plusieurs notions de base.

  • Mots-clés LSI (au sens SEO) : termes et expressions conceptuellement liés au mot-clé principal d’une page. Ils participent à décrire le même sujet, son contexte, ses attributs, ses usages, ses problèmes et solutions. Ils ne sont pas forcément interchangeables avec le mot-clé principal, mais ils permettent d’en préciser le sens.
  • Indexation sémantique latente : méthode mathématique de traitement du langage qui analyse les relations entre mots au sein d’un corpus de textes. Appliquée à la recherche d’information, elle facilite la compréhension des thématiques, même en présence de synonymes, de variations lexicales ou de bruit textuel.
  • Mot-clé sémantiquement lié : mot ou expression qui partage un contexte, un champ lexical ou une relation logique avec un mot-clé principal. Par exemple, pour « référencement naturel », des mots-clés sémantiquement liés peuventêtre « balises title », « maillage interne », « contenuéditorial », « intention de recherche ».
  • Type de mot-clé : catégorie de mots-clés selon plusieurs critères : intention de recherche (informationnelle, transactionnelle, navigationnelle), niveau de précision (générique, de longue traîne), stade du parcours client (découverte, comparaison, décision), ou encore rôle dans le contenu (principal, secondaire, support).

Comprendre et combiner ces concepts vous permet de produire des contenus à la fois plus complets, plus pertinents et mieux alignés avec les attentes des internautes.

Pourquoi les mots-clés sémantiquement liés sont essentiels

Les moteurs de recherche modernes ne se limitent plus à compter la fréquence d’un mot-clé. Ils analysent le contexte global, la structure sémantique du texte, les relations entre les termes, ainsi que le comportement des utilisateurs. Dans ce contexte, les mots-clés sémantiquement liés jouent plusieurs rôles :

  • Clarification du sujet : en intégrant un vocabulaire varié mais cohérent, vous facilitez la compréhension du thème principal, que ce soit pour un algorithme ou pour un lecteur humain.
  • Couverture plus large des requêtes : un même besoin utilisateur peut se traduire par des formulations différentes. Un champ lexical riche vous permet de vous positionner sur davantage de requêtes pertinentes autour d’un même sujet.
  • Réduction du risque de sur-optimisation : au lieu de répéter de manière artificielle le mot-clé principal, vous exploitez des variantes et des termes associés, ce qui rend le texte plus naturel et agréable à lire.
  • Meilleure adéquation à l’intention de recherche : en incluant des termes liés aux questions fréquentes, aux objections ou aux besoins concrets, vous répondez plus précisément aux attentes des internautes, ce qui améliore l’engagement (temps passé, taux de clic sur les liens internes, etc.).

Types de mots-clés dans une stratégie sémantique

Pour structurer efficacement votre contenu, il est utile de distinguer plusieurs types de mots-clés. Cette typologie ne s’oppose pas à la notion de LSI, elle la complète.

  • Mots-clés principaux : ce sont les termes stratégiques sur lesquels vous souhaitez vous positionner prioritairement. Ils servent de base au choix des titres (balise , <h1>) et orientent l’angle de la page. Exemple : « recherche de mots-clés LSI ».</li> <li><strong>Mots-clés secondaires</strong> : ils complètent et précisent le mot-clé principal. On y retrouve des variantes proches, des formulations courantes et des expressions associées. Exemple : « mots-clés sémantiquement liés », « indexation sémantique latente », « optimisation de contenu ».</li> <li><strong>Mots-clés de longue traîne</strong> : il s’agit de requêtes plus spécifiques, généralement composées de trois mots ou plus, qui révèlent souvent une intention très précise. Exemple : « comment trouver des mots-clés sémantiquement liés gratuitement ».</li> <li><strong>Mots-clés liés à l’intention informationnelle</strong> : ils traduisent une recherche d’information ou de compréhension. On y trouve souvent des formulations avec « comment », « pourquoi », « qu’est-ce que », « guide », « tutoriel », etc.</li> <li><strong>Mots-clés liés à l’intention transactionnelle</strong> : ces requêtes sont associées à un projet d’achat ou d’inscription. Elles incluent par exemple « prix », « comparatif », « avis », « meilleur outil LSI », « abonnement SEO ».</li> <li><strong>Mots-clés de navigation ou de marque</strong> : ils comportent un nom de marque, de produit ou de service, et témoignent d’une intention de trouver une ressource spécifique.</li> </ul> <p>En combinant ces différents types de mots-clés dans un même contenu, vous améliorez à la fois la précision sémantique et la couverture du sujet, ce qui favorise un meilleur positionnement global sur votre thématique.</p> <h2 id="comment-identifier-des-mots-cles-semantiquement-lies">Comment identifier des mots-clés sémantiquement liés</h2> <p>La recherche de mots-clés LSI ne se résume pas à utiliser un outil automatique. Une approche efficace combine votre expertise métier, l’observation des résultats de recherche et l’exploitation d’outils spécialisés. Voici plusieurs méthodes complémentaires :</p> <ul> <li><strong>Analyse des SERP (pages de résultats)</strong> : tapez votre mot-clé principal et analysez les premiers résultats : titres, sous-titres, extraits de contenu, « Autres questions posées », suggestions de Google (recherches associées). Tous ceséléments révèlent des termes sémantiquement liés récurrents.</li> <li><strong>Étude du vocabulaire métier</strong> : listez les notions, sous-thèmes, problèmes fréquents, indicateurs chiffrés, outils et méthodes liés à votre sujet. Ce travailéditorial fournit une base solide pour votre champ lexical.</li> <li><strong>Utilisation d’outils de recherche de mots-clés</strong> : les suites SEO comme Semrush, Ahrefs, des outils de suggestion de mots-clés, ou même les données de Google Ads peuvent aider à repérer des requêtes connexes, des variantes et des questions fréquemment posées.</li> <li><strong>Exploitation des données de votre site</strong> : via Google Search Console, vous pouvez identifier les requêtes qui génèrent des impressions et des clics vers vos pages, et ainsi repérer de nouveaux termes à intégrer dans vos contenus existants.</li> <li><strong>Observation des concurrents</strong> : en analysant le contenu le mieux positionné sur votre thématique, vous pouvez extraire des idées de termes sémantiquement liés que vous auriez oubliés, puis les adapter à votre propre approche.</li> </ul> <h2 id="bonnes-pratiques-d-integration-des-mots-cles-lsi-dans-le-contenu">Bonnes pratiques d’intégration des mots-clés LSI dans le contenu</h2> <p>Une fois vos mots-clés sémantiquement liés identifiés, l’enjeu est de les intégrer de manière naturelle, claire et utile pour l’utilisateur. Voici quelques lignes directrices.</p> <ul> <li><strong>Écrire pour l’utilisateur avant tout</strong> : commencez par construire un plan de contenu centré sur les questions et besoins de votre audience. Les mots-clés LSI viennent ensuite enrichir chaque partie sans forcer leur insertion.</li> <li><strong>Varier le champ lexical</strong> : utilisez des synonymes, des reformulations et des termes associés pouréviter les répétitions excessives du mot-clé principal tout en restant fidèle au sujet.</li> <li><strong>Soigner les zones stratégiques</strong> : intégrez des termes sémantiquement liés dans les balises <h2 id="et-dans-les-attributs-alt-des-images-ainsi-que-dans-les-ancres-de-liens-internes-lorsque-c-est-perti"> et <h3>, dans les attributs <em>alt</em> des images, ainsi que dans les ancres de liens internes lorsque c’est pertinent.</li> <li><strong>Maintenir une densité naturelle</strong> : il n’existe pas de pourcentage universel idéal. L’objectif est d’éviter le bourrage de mots-clés et de privilégier la lisibilité. Un lecteur humain ne doit jamais avoir l’impression que le texte est artificiel.</li> <li><strong>Mettre à jour régulièrement</strong> : les requêtesévoluent avec le temps. Revisitez vos contenus clés pour ajouter de nouveaux termes sémantiquement liés, répondre à de nouvelles questions et supprimer les passages obsolètes.</li> </ul> <h2>Structurer le contenu avec le HTML pour renforcer la sémantique</h2> <p>La structure HTML joue un rôle déterminant dans la compréhension de votre page par les moteurs de recherche et par les lecteurs. Une bonne hiérarchie de titres et de sous-titres permet de mettre en valeur vos mots-clés principaux et secondaires.</p> <ul> <li><strong><h1></strong> : titre principal de la page. Il doit contenir votre mot-clé principal ou une expression très proche, tout en restant naturel et attractif.</li> <li><strong><h2 id="sous-titres-de-sections-majeures-ils-peuvent-integrer-des-mots-cles-semantiquement-lies-des-variante"></strong> : sous-titres de sections majeures. Ils peuvent intégrer des mots-clés sémantiquement liés, des variantes du mot-clé principal ou des questions fréquentes.</li> <li><strong><h3> et suivants</strong> : sous-sections plus détaillées, utiles pour développer des sous-thèmes, desétudes de cas ou des exemples précis autour de vos termes LSI.</li> <li><strong>Listes <ul> / <ol></strong> : pratiques pour présenter des bonnes pratiques, des outils, desétapes ou des avantages. Elles facilitent la lecture et mettent enévidence des expressions clés.</li> <li><strong>Balises de mise en valeur (<strong>, <em>)</strong> : à utiliser avec parcimonie pour souligner certains termes importants, notamment vos principaux mots-clés sémantiques, sans en abuser.</li> </ul> <p>Une structure claire, combinée à un champ lexical riche, envoie des signaux cohérents sur le sujet traité et favorise un meilleur positionnement.</p> <h2>Outils et ressources pour la recherche de mots-clés LSI</h2> <p>Plusieurs outils peuvent vous aider à repérer des mots-clés sémantiquement liés et à analyser les performances de vos contenus :</p> <ul> <li><strong>Google Search Console</strong> : indispensable pour comprendre comment Google perçoit votre site. Vous pouvez y suivre les requêtes qui déclenchent l’affichage de vos pages, le taux de clic et la position moyenne. Cela permet d’identifier des termes intéressants à renforcer dans vos contenus.</li> <li><strong>Google Analytics</strong> : en observant les pages qui génèrent le plus de trafic organique, le temps passé et le taux de rebond, vous pouvez repérer les contenus qui répondent bien à l’intention de recherche et ceux qui nécessitent un enrichissement sémantique.</li> <li><strong>Outils de recherche de mots-clés spécialisés</strong> : des plateformes comme Semrush ou Ahrefs proposent des fonctionnalités avancées pour trouver des idées de mots-clés associés, analyser la concurrence, étudier les questions populaires et explorer la longue traîne.</li> <li><strong>Générateurs de questions et de sujets</strong> : certains outils se concentrent sur l’extraction des questions posées par les internautes sur un thème donné. Ils fournissent une excellente base pour créer des rubriques de FAQ ou des sections ciblant des intentions précises.</li> </ul> <p>L’essentiel n’est pas de multiplier les outils, mais de les utiliser pour nourrir une réflexionéditoriale centrée sur les besoins réels de votre audience.</p> <h2 id="exemples-concrets-de-mots-cles-semantiquement-lies">Exemples concrets de mots-clés sémantiquement liés</h2> <p>Pour illustrer le concept, prenons quelques exemples. Si votre mot-clé principal est « recherche de mots-clés LSI », des mots-clés sémantiquement liés pertinents pourraientêtre :</p> <ul> <li>« indexation sémantique latente »</li> <li>« champ lexical SEO »</li> <li>« mots-clés de longue traîne »</li> <li>« intention de recherche »</li> <li>« optimisation de contenu pour Google »</li> <li>« pertinence sémantique »</li> <li>« stratégieéditoriale SEO »</li> </ul> <p>Pour un autre sujet, par exemple « chaussures de running », les termes sémantiquement liés incluent « amorti », « foulée », « chaussures de course », « semelle », « performance », « marathon », « trail », etc. L’objectif n’est pas de tout lister, mais de sélectionner les expressions les plus utiles pour traiter le sujet en profondeur.</p> <h2 id="intention-de-recherche-et-mots-cles-lsi">Intention de recherche et mots-clés LSI</h2> <p>Les mots-clés sémantiquement liés sont particulièrement efficaces lorsque vous les choisissez en fonction de l’intention de recherche dominante. On distingue généralement trois grandes catégories :</p> <ul> <li><strong>Intention informationnelle</strong> : l’utilisateur souhaite comprendre un concept, résoudre un problème ou apprendre une méthode. Les contenus adaptés sont des guides, tutoriels, articles de blog détaillés, FAQ. Les mots-clés LSI mettront l’accent sur les définitions, lesétapes, les erreurs àéviter, les exemples pratiques.</li> <li><strong>Intention transactionnelle</strong> : l’utilisateur se prépare à acheter ou à s’inscrire. Les contenus privilégiés sont des fiches produits, comparatifs, études de cas, pages d’atterrissage. Les mots-clés sémantiquement liés incluront des termes sur les prix, les garanties, les fonctionnalités, les bénéfices concrets et les avis.</li> <li><strong>Intention navigationnelle</strong> : l’utilisateur cherche un site, une marque ou un service précis. Les mots-clés LSI auront moins de poids ici, mais des expressions associées à la marque, aux services et aux catégories peuvent renforcer la compréhension globale du site.</li> </ul> <p>En alignant votre sélection de mots-clés LSI sur l’intention de recherche, vous augmentez la pertinence de votre page et la probabilité que l’utilisateur trouve rapidement la réponse attendue.</p> <h2 id="faq-sur-la-recherche-de-mots-cles-lsi-et-semantiquement-lies">FAQ sur la recherche de mots-clés LSI et sémantiquement liés</h2> <ul> <li><em>Qu’est-ce qu’un mot-clé LSI au sens pratique pour le SEO ?</em></li> </ul> <p>Dans une approche SEO pragmatique, un mot-clé LSI est un terme ou une expression qui entretient un lien sémantique fort avec votre mot-clé principal. Il contribue à définir le sujet, à préciser le contexte et à couvrir les différentes facettes d’un thème. Même si les moteurs de recherche ne communiquent pas sur l’usage d’un algorithme LSI au sens strict, travailler un champ lexical riche reste bénéfique pour la compréhension de votre contenu.</p> <ul> <li><em>Les mots-clés LSI sont-ils des synonymes ?</em></li> </ul> <p>Pas uniquement. Certains mots-clés sémantiquement liés peuventêtre de vrais synonymes, mais la plupart sont des termes associés, des cooccurrences ou des sous-concepts. Par exemple, pour « SEO », des synonymes partiels seraient « référencement naturel », mais des mots-clés LSI incluraient aussi « balise title », « maillage interne », « contenu de qualité », « intention de recherche », qui ne sont pas des synonymes mais deséléments du même univers.</p> <ul> <li><em>Les mots-clés LSI suffisent-ils pour bien se positionner ?</em></li> </ul> <p>Non. Les mots-clés sémantiquement liés sont un levier parmi d’autres. Le positionnement dépendégalement de la qualité globale du contenu, de sa structure, de la popularité du site (backlinks), de l’expérience utilisateur (vitesse de chargement, ergonomie mobile, clarté de la navigation) et de nombreux signaux comportementaux. En revanche, un texte pauvre sémantiquement aura plus de mal à se positionner sur des requêtes concurrentielles.</p> <ul> <li><em>Commentéviter le bourrage de mots-clés tout en utilisant des termes LSI ?</em></li> </ul> <p>La meilleure approche consiste à rédiger d’abord un contenu complet et utile, puis à relire le texte pour vérifier que les principaux termes sémantiquement liés y figurent de façon naturelle. Si une expression est répétée de façon trop rapprochée sans nécessité, reformulez la phrase ou utilisez un synonyme. L’objectif est qu’un lecteur humain ne perçoive aucune lourdeur ni répétition artificielle.</p> <ul> <li><em>Combien de mots-clés sémantiquement liés faut-il intégrer par page ?</em></li> </ul> <p>Il n’existe pas de nombre idéal universel. Sur un article de fond de plusieurs milliers de mots, vous utiliserez naturellement plusieurs dizaines de termes associés sans même vous en rendre compte. Ce qui compte, c’est la couverture logique du sujet : vos contenus doivent répondre aux questions clés, aborder les sous-thèmes importants et utiliser un vocabulaire cohérent avec votre thématique et votre audience.</p> <h2 id="processus-pas-a-pas-pour-une-recherche-de-mots-cles-lsi-efficace">Processus pas à pas pour une recherche de mots-clés LSI efficace</h2> <p>Pour mettre en pratique tout ce qui précède, vous pouvez suivre un processus simple en plusieursétapes :</p> <ul> <li><strong>1. Définir le sujet et l’objectif de la page</strong> : clarifiez le mot-clé principal, l’intention de recherche visée et le type de contenu le plus adapté (guide, page service, comparatif, etc.).</li> <li><strong>2. Dresser une première liste de termes</strong> : à partir de votre expertise, notez les concepts, questions, problèmes, solutions, outils, indicateurs chiffrés et exemples qui gravitent autour du sujet.</li> <li><strong>3. Enrichir la liste avec des outils</strong> : utilisez Search Console, des outils de suggestion de mots-clés et l’analyse des SERP pour compléter votre liste avec des requêtes et expressions réellement utilisées par les internautes.</li> <li><strong>4. Organiser les mots-clés par type</strong> : distinguez les mots-clés principaux, secondaires, de longue traîne, ainsi que ceux liés à l’intention informationnelle ou transactionnelle. Cela facilitera la construction du plan.</li> <li><strong>5. Construire un plan de contenu détaillé</strong> : créez vos titres et sous-titres en vous appuyant sur les mots-clés identifiés, en veillant à couvrir l’ensemble du sujet sans redondance inutile.</li> <li><strong>6. Rédiger puis optimiser</strong> : rédigez le texte de façon fluide, puis effectuez une relecture orientée SEO pour vous assurer que les principaux termes sémantiquement liés apparaissent dans les sections clés.</li> <li><strong>7. Mesurer et ajuster</strong> : après publication, surveillez les performances de la page (trafic, positions, requêtes déclenchées) et ajustez le contenu si de nouveaux mots-clés intéressants apparaissent dans vos rapports.</li> </ul> <h2 id="erreurs-courantes-a-eviter-avec-les-mots-cles-semantiquement-lies">Erreurs courantes àéviter avec les mots-clés sémantiquement liés</h2> <p>Certaines erreurs reviennent régulièrement lorsqu’on découvre le concept de mots-clés LSI :</p> <ul> <li><strong>Se focaliser uniquement sur les outils</strong> : s’en remettre exclusivement à des générateurs de mots-clés sans réflexionéditoriale mène souvent à des textes mécaniques et peu utiles. La connaissance du sujet reste centrale.</li> <li><strong>Confondre LSI et simple répétition de variantes</strong> : empiler des dérivés proches du même mot (singulier, pluriel, ordre des mots différent) sans enrichissement réel du sens ne constitue pas une stratégie sémantique efficace.</li> <li><strong>Ignorer l’intention de recherche</strong> : multiplier les mots-clés sémantiquement liés sans se demander à quelles questions concrètes ils répondent aboutit à des contenus verbeux, qui génèrent peu d’engagement.</li> <li><strong>Sur-optimiser les balises</strong> : ajouter trop de mots-clés dans les titres, méta descriptions ou ancres de lien peut nuire à la lisibilité etêtre interprété comme du bourrage de mots-clés.</li> </ul> <h2 id="vers-une-approche-semantique-globale-de-vos-contenus">Vers une approche sémantique globale de vos contenus</h2> <p>La recherche de mots-clés LSI et de mots-clés sémantiquement liés s’inscrit dans une démarche plus large : passer d’une logique purement « mot-clé » à une véritable logique de « sujet » ou de « thématique ». Plutôt que de multiplier les pages très proches ciblant chacune une variante de requête, il devient plus pertinent de créer des contenus structurés, profonds, qui couvrent un sujet dans sa globalité et exploitent intelligemment la richesse du langage.</p> <p>En investissant du temps dans la compréhension de votre audience, dans l’analyse de l’intention de recherche et dans la construction d’un champ lexical solide, vous mettez toutes les chances de votre côté pour améliorer la visibilité de votre site, renforcer l’autorité de vos pages et offrir une expérience réellement utile à vos visiteurs.</p> </div> <!-- Articles similaires --> <div class="mt-12 pt-8 border-t border-gray-200"> <h2 class="text-2xl font-bold text-gray-900 mb-6 flex items-center gap-2"> <i class="fas fa-newspaper text-purple-600"></i> Articles similaires </h2> <div class="grid gap-4"> <a href="/blog/keyword-guide-complet-sur-les-mots-cles-en-seo/" class="block p-4 bg-white rounded-lg border border-gray-200 hover:border-purple-300 hover:shadow-md transition"> <span class="text-purple-600 font-semibold hover:text-purple-800">Keyword : guide complet sur les mots-clés en SEO</span> </a> <a href="/blog/referencement-naturel-et-mots-cles-guide-complet-2025/" class="block p-4 bg-white rounded-lg border border-gray-200 hover:border-purple-300 hover:shadow-md transition"> <span class="text-purple-600 font-semibold hover:text-purple-800">Référencement naturel et mots-clés : guide complet 2025</span> </a> <a href="/blog/mots-cles-seo-le-guide-complet-pour-booster-votre-visibilite/" class="block p-4 bg-white rounded-lg border border-gray-200 hover:border-purple-300 hover:shadow-md transition"> <span class="text-purple-600 font-semibold hover:text-purple-800">Mots-clés SEO : le guide complet pour booster votre visibilité</span> </a> </div> </div> <!-- CTA Section --> <div class="mt-12 pt-8 border-t border-gray-200"> <div class="bg-gradient-to-r from-purple-600 to-blue-600 rounded-xl p-8 text-center text-white"> <h3 class="text-2xl font-bold mb-4">Besoin d'aide avec votre SEO ?</h3> <p class="mb-6 text-purple-100">Notreéquipe d'experts peut vous aider à optimiser votre site e-commerce</p> <div class="flex flex-col sm:flex-row gap-4 justify-center"> <a href="/seo-ecommerce" class="bg-white text-purple-600 px-8 py-3 rounded-lg font-semibold hover:bg-purple-50 transition inline-block"> Découvrir nos services SEO </a> <a href="/#contact" class="bg-purple-800 text-white px-8 py-3 rounded-lg font-semibold hover:bg-purple-900 transition inline-block"> Nous contacter </a> </div> </div> </div> </article> <!-- Section Commentaires --> <div class="mt-12 max-w-4xl mx-auto bg-white rounded-2xl shadow-xl p-8 md:p-12"> <h2 class="text-3xl font-bold text-gray-900 mb-6 flex items-center gap-3"> <i class="fas fa-comments text-purple-600"></i> Commentaires </h2> <!-- Liste des commentaires approuvés --> <div id="comments-list" class="mb-8 space-y-6"> <!-- Les commentaires approuvés seront chargés ici via JavaScript --> </div> <!-- Formulaire de commentaire --> <div class="border-t border-gray-200 pt-8"> <h3 class="text-xl font-semibold text-gray-900 mb-4">Laisser un commentaire</h3> <form id="comment-form" class="space-y-4"> <input type="hidden" id="article-slug" value="mots-cles-lsi-latent-semantic-indexing"> <div class="grid md:grid-cols-2 gap-4"> <div> <label for="comment-name" class="block text-sm font-medium text-gray-700 mb-2">Nom *</label> <input type="text" id="comment-name" name="name" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-600 focus:border-transparent"> </div> <div> <label for="comment-email" class="block text-sm font-medium text-gray-700 mb-2">Email *</label> <input type="email" id="comment-email" name="email" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-600 focus:border-transparent"> </div> </div> <div> <label for="comment-message" class="block text-sm font-medium text-gray-700 mb-2">Message *</label> <textarea id="comment-message" name="message" rows="5" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-600 focus:border-transparent"></textarea> </div> <div class="text-sm text-gray-600"> <i class="fas fa-info-circle text-purple-600"></i> Votre commentaire sera soumis à modération avant publication. </div> <button type="submit" class="bg-gradient-to-r from-purple-600 to-blue-600 text-white px-8 py-3 rounded-lg font-semibold hover:from-purple-700 hover:to-blue-700 transition inline-flex items-center gap-2"> <i class="fas fa-paper-plane"></i> Publier le commentaire </button> </form> <div id="comment-status" class="mt-4 hidden"></div> </div> </div> <!-- Navigation Articles --> <div class="mt-12 max-w-4xl mx-auto"> <a href="/blog" class="inline-flex items-center gap-2 text-purple-600 hover:text-purple-800 transition font-semibold"> <i class="fas fa-arrow-left"></i> Retour au blog </a> </div> </div> </section> <!-- Script pour les commentaires --> <script> const articleSlug = 'mots-cles-lsi-latent-semantic-indexing'; // Charger les commentaires approuvés async function loadComments() { try { const response = await fetch(`/gestion-commentaires/get-comments.php?slug=${articleSlug}`); const data = await response.json(); const commentsList = document.getElementById('comments-list'); if (data.success && data.comments.length > 0) { commentsList.innerHTML = data.comments.map(comment => ` <div class="border-l-4 border-purple-600 pl-4 py-2"> <div class="flex items-center gap-2 mb-2"> <strong class="text-gray-900">${comment.name}</strong> <span class="text-sm text-gray-500">•</span> <span class="text-sm text-gray-500">${new Date(comment.date).toLocaleDateString('fr-FR')}</span> </div> <p class="text-gray-700">${comment.message}</p> </div> `).join(''); } else { commentsList.innerHTML = '<p class="text-gray-500 italic">Aucun commentaire pour le moment. Soyez le premier à commenter !</p>'; } } catch (error) { console.error('Erreur lors du chargement des commentaires:', error); } } // Gérer la soumission du formulaire document.getElementById('comment-form').addEventListener('submit', async function(e) { e.preventDefault(); const formData = { slug: articleSlug, name: document.getElementById('comment-name').value, email: document.getElementById('comment-email').value, message: document.getElementById('comment-message').value }; const submitBtn = this.querySelector('button[type="submit"]'); const originalText = submitBtn.innerHTML; submitBtn.disabled = true; submitBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Envoi en cours...'; try { const response = await fetch('/gestion-commentaires/submit-comment.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }); const result = await response.json(); const messageDiv = document.getElementById('comment-status'); if (result.success) { messageDiv.className = 'mt-4 p-4 bg-green-100 border border-green-400 text-green-700 rounded-lg'; messageDiv.textContent = 'Merci ! Votre commentaire aété soumis et sera publié après modération.'; messageDiv.classList.remove('hidden'); this.reset(); } else { messageDiv.className = 'mt-4 p-4 bg-red-100 border border-red-400 text-red-700 rounded-lg'; messageDiv.textContent = result.message || 'Une erreur est survenue. Veuillez réessayer.'; messageDiv.classList.remove('hidden'); } } catch (error) { const messageDiv = document.getElementById('comment-status'); messageDiv.className = 'mt-4 p-4 bg-red-100 border border-red-400 text-red-700 rounded-lg'; messageDiv.textContent = 'Erreur de connexion. Veuillez réessayer plus tard.'; messageDiv.classList.remove('hidden'); } finally { submitBtn.disabled = false; submitBtn.innerHTML = originalText; } }); // Charger les commentaires au chargement de la page loadComments(); </script> <footer class="bg-gray-950 text-gray-400 py-12"> <div class="container mx-auto px-6"> <div class="flex flex-col md:flex-row justify-between items-center"> <div class="mb-6 md:mb-0 flex items-start gap-4"> <img src="/images/logo.png" alt="Logo VRAIVEX" class="h-32 w-32 md:h-40 md:w-40 object-contain"> <div> <a href="#" class="text-2xl font-bold block"> <span class="gradient-text">VRAIVEX</span> </a> <p class="mt-2 text-sm">Automatisation, IA et SEO au service de la performance e-commerce</p> </div> </div> <div class="flex flex-col items-center md:items-end"> <div class="grid grid-cols-2 md:flex md:flex-wrap gap-3 md:space-x-6 mb-4 text-center md:text-right"> <a href="/#about" class="hover:text-white transition text-sm">À propos</a> <a href="/#services" class="hover:text-white transition text-sm">Services</a> <a href="/#prestations" class="hover:text-white transition text-sm">Prestations</a> <a href="/#bestsellers" class="hover:text-white transition text-sm">Best Sellers</a> <a href="/#realisations" class="hover:text-white transition text-sm">Réalisations</a> <a href="/#brands" class="hover:text-white transition text-sm">Nos Sites</a> <a href="/creation-site-ecommerce" class="hover:text-white transition text-sm">Création Sites</a> <a href="/seo-ecommerce" class="hover:text-white transition text-sm">SEO E-commerce</a> <a href="/partenaires" class="hover:text-white transition text-sm">Partenaires</a> <a href="/#contact" class="hover:text-white transition text-sm">Contact</a> </div> <p class="text-sm text-center md:text-right">© 2026 VRAIVEX. Tous droits réservés.</p> </div> </div> </div> </footer> <!-- Back to Top Button --> <button id="backToTop" class="fixed bottom-8 right-8 bg-gradient-to-r from-purple-600 to-blue-600 text-white p-4 rounded-full shadow-lg hover:shadow-xl transform hover:scale-110 transition-all duration-300 z-50 hidden"> <i class="fas fa-arrow-up text-xl"></i> </button> <script> // Header scroll effect window.addEventListener('scroll', function() { const header = document.getElementById('header'); if (window.scrollY > 100) { header.classList.add('header-scrolled'); } else { header.classList.remove('header-scrolled'); } }); // Smooth scrolling for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); document.querySelector(this.getAttribute('href')).scrollIntoView({ behavior: 'smooth' }); }); }); // Mobile menu toggle const mobileMenuButton = document.getElementById('mobileMenuButton'); const mobileMenu = document.getElementById('mobileMenu'); const menuIcon = document.getElementById('menuIcon'); if (mobileMenuButton && mobileMenu) { mobileMenuButton.addEventListener('click', function() { mobileMenu.classList.toggle('hidden'); // Toggle icon between bars and times if (mobileMenu.classList.contains('hidden')) { menuIcon.classList.remove('fa-times'); menuIcon.classList.add('fa-bars'); } else { menuIcon.classList.remove('fa-bars'); menuIcon.classList.add('fa-times'); } }); // Close menu when clicking on a link const mobileLinks = mobileMenu.querySelectorAll('a'); mobileLinks.forEach(link => { link.addEventListener('click', function() { mobileMenu.classList.add('hidden'); menuIcon.classList.remove('fa-times'); menuIcon.classList.add('fa-bars'); }); }); } // Brands Carousel const brandsCarousel = document.getElementById('brandsCarousel'); const brandsContainer = document.getElementById('brandsContainer'); const brandsPrevBtn = document.getElementById('brandsPrevBtn'); const brandsNextBtn = document.getElementById('brandsNextBtn'); const brandsPrevBtnMobile = document.getElementById('brandsPrevBtnMobile'); const brandsNextBtnMobile = document.getElementById('brandsNextBtnMobile'); if (brandsContainer && brandsCarousel) { let currentIndex = 0; const cards = brandsContainer.querySelectorAll('.brand-card'); const gap = 24; const cardsPerView = { mobile: 1, tablet: 2, desktop: 3, large: 4 }; function getCardsPerView() { const w = window.innerWidth; if (w >= 1280) return cardsPerView.large; if (w >= 1024) return cardsPerView.desktop; if (w >= 768) return cardsPerView.tablet; return cardsPerView.mobile; } function getCardWidth() { const cpv = getCardsPerView(); const cw = brandsCarousel.offsetWidth; return (cw - gap * (cpv - 1)) / cpv; } function updateCarousel() { const cpv = getCardsPerView(); const cardW = getCardWidth(); const maxIdx = Math.max(0, cards.length - cpv); currentIndex = Math.min(currentIndex, maxIdx); const offset = currentIndex * (cardW + gap); brandsContainer.style.transform = `translateX(-${offset}px)`; const atStart = currentIndex === 0; const atEnd = currentIndex >= maxIdx; [brandsPrevBtn, brandsPrevBtnMobile].forEach(function(btn) { if (btn) { btn.style.opacity = atStart ? '0.4' : '1'; btn.style.pointerEvents = atStart ? 'none' : 'auto'; } }); [brandsNextBtn, brandsNextBtnMobile].forEach(function(btn) { if (btn) { btn.style.opacity = atEnd ? '0.4' : '1'; btn.style.pointerEvents = atEnd ? 'none' : 'auto'; } }); if (document.getElementById('brandsCounter')) { document.getElementById('brandsCounter').textContent = (currentIndex + 1) + ' / ' + (maxIdx + 1); } } function nextSlide() { const cpv = getCardsPerView(); const maxIdx = Math.max(0, cards.length - cpv); if (currentIndex < maxIdx) { currentIndex++; updateCarousel(); } } function prevSlide() { if (currentIndex > 0) { currentIndex--; updateCarousel(); } } if (brandsNextBtn) brandsNextBtn.addEventListener('click', nextSlide); if (brandsPrevBtn) brandsPrevBtn.addEventListener('click', prevSlide); if (brandsNextBtnMobile) brandsNextBtnMobile.addEventListener('click', nextSlide); if (brandsPrevBtnMobile) brandsPrevBtnMobile.addEventListener('click', prevSlide); function setCardWidths() { const cardW = getCardWidth(); cards.forEach(function(card) { card.style.width = cardW + 'px'; card.style.minWidth = cardW + 'px'; card.style.flexShrink = '0'; }); } let touchStartX = 0; let touchEndX = 0; brandsCarousel.addEventListener('touchstart', function(e) { touchStartX = e.changedTouches[0].screenX; }, { passive: true }); brandsCarousel.addEventListener('touchend', function(e) { touchEndX = e.changedTouches[0].screenX; const diff = touchStartX - touchEndX; if (Math.abs(diff) > 50) { diff > 0 ? nextSlide() : prevSlide(); } }, { passive: true }); setCardWidths(); updateCarousel(); let resizeTimeout; window.addEventListener('resize', function() { clearTimeout(resizeTimeout); resizeTimeout = setTimeout(function() { setCardWidths(); currentIndex = 0; updateCarousel(); }, 250); }); } </script> <script> // Header scroll effect window.addEventListener('scroll', function() { const header = document.getElementById('header'); if (window.scrollY > 50) { header.classList.add('header-scrolled'); } else { header.classList.remove('header-scrolled'); } }); // Scroll animations const observerOptions = { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }; const observer = new IntersectionObserver(function(entries) { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('visible'); } }); }, observerOptions); // Observe all fade-in-up elements document.querySelectorAll('.fade-in-up').forEach(el => { observer.observe(el); }); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); // Counter animation for stats function animateCounter(element, target, duration = 2000) { let start = 0; const increment = target / (duration / 16); const timer = setInterval(() => { start += increment; if (start >= target) { element.textContent = target + (element.textContent.includes('+') ? '+' : '') + (element.textContent.includes('K') ? 'K€' : ''); clearInterval(timer); } else { element.textContent = Math.floor(start) + (element.textContent.includes('+') ? '+' : '') + (element.textContent.includes('K') ? 'K€' : ''); } }, 16); } // Observe stats section const statsObserver = new IntersectionObserver(function(entries) { entries.forEach(entry => { if (entry.isIntersecting && !entry.target.classList.contains('animated')) { entry.target.classList.add('animated'); const statsCards = entry.target.querySelectorAll('.stats-card'); statsCards.forEach((card, index) => { setTimeout(() => { card.style.opacity = '0'; card.style.transform = 'translateY(20px)'; setTimeout(() => { card.style.transition = 'all 0.6s ease'; card.style.opacity = '1'; card.style.transform = 'translateY(0)'; }, 100); }, index * 100); }); } }); }, { threshold: 0.3 }); const statsSection = document.querySelector('section.bg-gradient-to-r'); if (statsSection) { statsObserver.observe(statsSection); } </script> <script> // Gestion du formulaire de contact const contactForm = document.getElementById('contact-form'); const formMessage = document.getElementById('form-message'); const submitBtn = document.getElementById('submit-btn'); if (contactForm) { contactForm.addEventListener('submit', async function(e) { e.preventDefault(); // Désactiver le bouton pendant l'envoi submitBtn.disabled = true; submitBtn.textContent = 'Envoi en cours...'; // Récupérer les données du formulaire const formData = new FormData(contactForm); try { // Vérifier que les données sont bien dans le FormData const formDataObj = { name: formData.get('name'), email: formData.get('email'), subject: formData.get('subject'), message: formData.get('message') }; console.log('Données du formulaire:', formDataObj); // Vérifier que tous les champs sont remplis if (!formDataObj.name || !formDataObj.email || !formDataObj.subject || !formDataObj.message) { formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; formMessage.textContent = 'Veuillez remplir tous les champs du formulaire.'; submitBtn.disabled = false; submitBtn.textContent = 'Envoyer le message'; return; } // Essayer d'abord avec JSON (plus fiable) // Siça ne fonctionne pas, on essaiera avec FormData let response; try { // Méthode 1 : Envoyer en JSON (plus fiable selon les forums) response = await fetch('gestion-formulaire-contact/send-email-json.php', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(formDataObj) }); } catch (jsonError) { console.warn('Erreur avec JSON, essai avec FormData:', jsonError); // Méthode 2 : Fallback avec FormData response = await fetch('send-email.php', { method: 'POST', body: formData }); } // Lire le texte de la réponse d'abord pour déboguer const responseText = await response.text(); console.log('Réponse serveur:', responseText.substring(0, 500)); // Vérifier si la réponse est OK if (!response.ok) { // Essayer de parser le JSON d'erreur try { const errorResult = JSON.parse(responseText); // Afficher le message d'erreur du serveur directement à l'utilisateur formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; formMessage.textContent = errorResult.message || `Erreur ${response.status}: ${response.statusText}`; submitBtn.disabled = false; submitBtn.textContent = 'Envoyer le message'; return; // Sortir de la fonction pour ne pas continuer } catch (e) { throw new Error(`Erreur HTTP ${response.status}: ${response.statusText}. Réponse: ${responseText.substring(0, 200)}`); } } // Vérifier si PHP n'est pas exécuté (le serveur renvoie le code PHP brut) if (responseText.trim().startsWith('<?php') || responseText.includes('<?php')) { console.error('ERREUR: PHP n\'est pas exécuté par le serveur. Le code PHP est renvoyé brut.'); console.error('Le serveur web n\'est pas configuré pour exécuter PHP.'); // Utiliser la solution de secours : sauvegarder dans localStorage const messageData = { name: formData.get('name'), email: formData.get('email'), subject: formData.get('subject'), message: formData.get('message'), timestamp: new Date().toISOString() }; // Sauvegarder dans localStorage comme solution de secours const savedMessages = JSON.parse(localStorage.getItem('vraivex_messages') || '[]'); savedMessages.push(messageData); localStorage.setItem('vraivex_messages', JSON.stringify(savedMessages)); // Afficher un message spécial formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-yellow-600 text-white'; formMessage.innerHTML = '⚠️ PHP n\'est pas configuré sur le serveur. Votre message aété sauvegardé localement. <br>Veuillez nous contacter directement à <strong>contact@vraivex.fr</strong> ou consulter les messages sauvegardés dans la console du navigateur.'; // Afficher les messages sauvegardés dans la console console.log('Messages sauvegardés localement:', savedMessages); console.log('Pour consulter les messages, tapez dans la console: JSON.parse(localStorage.getItem("vraivex_messages"))'); return; // Sortir de la fonction } // Essayer de parser le JSON let result; try { result = JSON.parse(responseText); } catch (parseError) { console.error('Erreur de parsing JSON:', parseError); console.error('Réponse reçue:', responseText.substring(0, 500)); throw new Error('Le serveur a renvoyé une réponse invalide. Vérifiez la console pour plus de détails.'); } // Afficher le message de résultat formMessage.classList.remove('hidden'); if (result.success) { formMessage.className = 'mb-6 p-4 rounded-lg bg-green-600 text-white'; formMessage.textContent = 'Message envoyé avec succès ! Nous vous répondrons dans les plus brefs délais.'; contactForm.reset(); } else { formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; let errorMsg = result.message || 'Une erreur est survenue. Veuillez réessayer.'; // Afficher le message de debug en développement (à retirer en production) if (result.debug) { console.error('Erreur détaillée:', result.debug); } formMessage.textContent = errorMsg; } } catch (error) { formMessage.classList.remove('hidden'); formMessage.className = 'mb-6 p-4 rounded-lg bg-red-600 text-white'; // Message d'erreur plus détaillé pour le débogage let errorMsg = 'Une erreur est survenue lors de la communication avec le serveur. '; errorMsg += 'Veuillez réessayer plus tard ou nous contacter directement à contact@vraivex.fr'; // En mode développement, afficher plus de détails if (error.message) { console.error('Erreur détaillée:', error); console.error('Message:', error.message); console.error('Stack:', error.stack); } formMessage.textContent = errorMsg; } finally { // Réactiver le bouton submitBtn.disabled = false; submitBtn.textContent = 'Envoyer le message'; // Masquer le message après 5 secondes setTimeout(() => { formMessage.classList.add('hidden'); }, 5000); } }); } // Back to Top Button functionality const backToTopButton = document.getElementById('backToTop'); // Show/hide button based on scroll position window.addEventListener('scroll', () => { if (window.pageYOffset > 300) { backToTopButton.classList.remove('hidden'); } else { backToTopButton.classList.add('hidden'); } }); // Smooth scroll to top when clicked backToTopButton.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); </script> </body> </html>