Publié le 12 février 2026 SEO Technique

SEO local et variations du nom d'entreprise : concept, risques et bonnes pratiques

Sommaire de l'article

Introduction

Le SEO local est devenu un levier incontournable pour les entreprises qui souhaitent se démarquer dans un environnement de plus en plus concurrentiel. Une part très importante des recherches effectuées sur Google comporte aujourd’hui une intention locale, et la majorité des utilisateurs se servent d’Internet pour trouver des informations sur des entreprises proches de chez eux. Dans ce contexte, le nom de votre entreprise – et la façon dont il est utilisé en ligne – joue un rôle stratégique.

Parmi les leviers souventévoqués figure la notion de variations du nom d’entreprise, parfois appelée en anglais Local Business Name Variations. L’idée semble séduisante : décliner le nom de la marque pour capter davantage de requêtes locales et intégrer plus de mots-clés. Cependant, cette approche se heurte directement à plusieurs contraintes majeures :

  • les consignes officielles de Google Business Profile, qui exigent un nom fidèle à la réalité de l’établissement ;
  • la nécessité de cohérence NAP (Name, Address, Phone) entre toutes vos présences en ligne ;
  • le risque de suspension, de perte d’avis et de visibilité en cas de non-respect de ces règles.

Cet article propose une vision complète, à jour et pragmatique du concept de variations du nom d’entreprise en SEO local : définition, cadre réglementaire, opportunités réelles, risques, bonnes pratiques et méthodologie concrète pour optimiser votre visibilité sans mettre en danger vos fiches locales.

Qu’est-ce qu’une variation du nom d’entreprise en SEO local ?

Les variations du nom d’entreprise désignent les différentes formes ou versions du nom de votre marque qui peuvent apparaître sur le web, dans vos optimisations SEO locales ou dans vos profils d’établissement. Il peut s’agir par exemple :

  • de traductions ou adaptations linguistiques légitimes : « Librairie Paris » et « Paris Bookstore » si l’enseigne utilise réellement ces deux formes sur ses supports officiels ;
  • de versions abrégées ouétendues : « Garage Belles Autos » et « SARL Garage Belles Autos » ;
  • de déclinaisons par enseigne, franchise ou marque associée : par exemple, une même société pouvant exploiter plusieurs enseignes différentes à une même adresse pour des activités réellement distinctes.

En revanche, des variantes du type « Librairie Paris – Livres pas chers Paris 15 » ou « Plombier Express Paris Urgences 24/7 » alors que ce n’est pas le nom réel de l’entreprise relèvent davantage de la sur-optimisation de mot-clé que d’une variation légitime. Ces pratiques sont explicitement contraires aux consignes de Google Business Profile.

Il est donc crucial de distinguer :

  • les variations officielles et cohérentes du nom (marque, raison sociale, enseignes vraiment utilisées)
  • les variations artificielles créées uniquement pour manipuler le référencement local.

Le rôle du nom d’entreprise dans le SEO local

Le nom commercial est l’un deséléments les plus visibles de votre présence locale :

  • il apparaît dans votre profil Google Business Profile (ex-Google My Business) ;
  • il est repris dans les résultats de recherche locaux (Local Pack, Google Maps) ;
  • il est présent sur vos annonces, votre site web, vos réseaux sociaux et vos fiches d’annuaires.

Lesétudes sur les facteurs de classement locaux montrent que leséléments liés au profil (catégorie principale, pertinence du nom, proximité, avis) sont fortement corrélés aux performances dans le pack local. Les mots-clés métiers ou de localisation présents dans le nom d’établissement peuvent – lorsqu’ils sont légitimes – contribuer à la visibilité. Cependant, Google rappelle officiellement que le nom indiqué doit correspondre au nom réel de l’établissement dans la vie courante (enseigne, signalétique, mentions légales, documents commerciaux, etc.).

Parallèlement, la cohérence du NAP (Name, Address, Phone) reste un pilier du SEO local : plus vos noms, adresses et numéros de téléphone sont identiques d’un support à l’autre (site, Google Business Profile, annuaires, réseaux sociaux), plus vos signaux de confiance sont forts. Des variations injustifiées de nom peuvent fragiliser cette cohérence, brouiller les signaux et, dans certains cas, entraîner des corrections automatiques ou des mesures de modération de la part de Google.

Cadre Google Business Profile : ce qui est autorisé et ce qui ne l’est pas

Pour comprendre comment utiliser ou non les variations de nom d’entreprise en SEO local, il faut partir des consignes officielles de Google Business Profile concernant le nom d’établissement. En substance :

  • le nom doit refléter fidèlement le nom réel de votre entreprise, tel qu’il est utilisé dans la réalité ;
  • l’ajout d’informations inutiles (slogans marketing, liste de services, villes, quartiers, numéros de téléphone) n’est pas autorisé ;
  • les mots-clés ajoutés uniquement pour le référencement sont considérés comme une violation des règles et peuvent conduire à une suspension de la fiche ;
  • Google peut corriger ou modifier automatiquement un nom jugé non conforme, et dans les cas graves, suspendre ou supprimer la fiche, avec perte potentielle des avis.

Dans le même temps, Google reconnaît la possibilité qu’une même adresse dispose de plusieurs fiches lorsque plusieurs activités légalement distinctes coexistent à ce lieu (par exemple un même garage proposant une activité de réparation mécanique, une activité de location de véhicules et une activité de contrôle technique, chacune sous une enseigne clairement affichée et différenciée). Dans ce cas, les variations de nom correspondent à des entités commerciales réelles, et non à des déclinaisons artificielles d’un mêmeétablissement.

Il est donc incorrect de présenter les Business Name Variations comme une technique libre et sans risques pour multiplier les mots-clés dans les titres de fiches. Dans la pratique, toute modification de nom sortant du cadre du nom réel de l’établissement expose à un risque de vérification, de correction ou de suspension.

Variations du nom d’entreprise : opportunités réelles et limites

Les variations de nom d’entreprise peuvent malgré tout jouer un rôle stratégique si l’on respecte strictement les règles et le bon sens marketing. Voici ce qui est envisageable – et ce qui ne l’est pas.

Ce qui peutêtre pertinent

  • Aligner le nom de la fiche sur l’enseigne physique : si votre enseigne visible comporte déj à un mot-clé métier ou local (par exemple « Boulangerie des Halles Lyon »), il est parfaitement légitime d’utiliser ce nom tel quel dans Google Business Profile.
  • Utiliser la raison sociale complète lorsque c’est utile : par exemple, « SARL Garage Belles Autos » au lieu de « Garage Belles Autos », si ces deux formes sont utilisées dans vos documents officiels.
  • Créer plusieurs fiches pour plusieurs marques ou activités distinctes à la même adresse, à condition que chaque entité :
    • dispose d’une enseigne propre ;
    • corresponde à une activité réellement différenciée ;
    • soit identifiable pour le client (signalétique, site, documentation, etc.).
  • Adapter légèrement le nom lors d’un rebranding réel : lors d’un changement d’enseigne ou de stratégie de marque, le nom peutévoluer, mais il doitêtre appuyé par des preuves concrètes (nouvelle signalétique, mentions légales, site mis à jour, etc.).

Ce qui est risqué ou déconseillé

  • Ajouter artificiellement la ville ou le quartier dans le nom si cela ne figure pas dans le nom réel de l’enseigne.
  • Empiler les mots-clés métiers dans le titre de la fiche (par exemple : « Plombier Chauffagiste Débouchage Canalisation Urgence Paris »).
  • Multiplier des fiches pour la même activité et le mêmeétablissement en changeant seulement légèrement le nom pour cibler plusieurs requêtes locales.
  • Modifier fréquemment le nom d’une fiche ancienne bienétablie pour tester différentes variantes : le simple changement de nom peut suffire à alerter Google et entraîner une modération.

En résumé, les variations de nom peuventêtre exploitées lorsqu’elles correspondent à une réalité commerciale et de marque. Dès qu’elles servent uniquement à insérer des mots-clés ou des villes dans le nom, elles deviennent une source de risque plutôt qu’un levier durable.

Bonnes pratiques pour utiliser (ou non) les variations de nom en SEO local

Pour optimiser votre visibilité locale tout en protégeant vos fiches, il est essentiel d’adopter une approche structurée. Les bonnes pratiques ci-dessous tiennent compte à la fois du SEO, des consignes Google et de la cohérence de votre identité de marque.

1. Prioriser la cohérence de marque et du NAP

Votre priorité doitêtre de garantir une cohérence parfaite de votre nom d’entreprise sur tous vos canaux :

  • site web (en particulier la page contact et les mentions légales) ;
  • Google Business Profile ;
  • annuaire professionnels et plateformes locales ;
  • réseaux sociaux (Facebook, Instagram, LinkedIn, etc.) ;
  • documents hors ligne (factures, devis, cartes de visite, signalétique, flyers).

Plus vos informations sont homogènes, plus les moteurs de recherche peuvent vous associer facilement à une entité unique fiable. À l’inverse, des variations injustifiées de nom entre ces supports peuvent semer le doute, nuire à la confiance et diluer vos signaux de pertinence locale.

2. Optimiser le contenu plutôt que le nom de la fiche

Plutôt que de sur-optimiser le nom de votre fiche, concentrez vos efforts sur leséléments qui peuvent accueillir vos mots-clés de manière naturelle et conforme :

  • Les titres et balises HTML de votre site (balise </code>, balises <code><h1></code>, <code><h2 id="etc-peuvent-integrer-des-expressions-telles-que-nbsp-librairie-a-paris-15-nbsp-ou-nbsp-plombier-d-ur"></code>, etc.) peuvent intégrer des expressions telles que <em>« librairie à Paris 15 »</em> ou <em>« plombier d’urgence à Lyon »</em>.</li> <li><strong>Les contenus de pages</strong> (pages de services, pages locales, articles de blog) peuvent détailler vos prestations par zone géographique, en incluant les requêtes locales pertinentes.</li> <li><strong>La description de votre fiche Google Business Profile</strong> permet de mentionner vos services et votre zone d’intervention, sans modifier le nom.</li> <li><strong>Les posts Google Business Profile</strong> et les publications sur les réseaux sociaux peuventêtre utilisés pour travailler finement le champ lexical et les expressions locales.</li> </ul> <p>Cette approche respecte pleinement les consignes de Google, renforce votre visibilité organique et limite fortement le risque de suspension lié au nom de l’établissement.</p> <h3>3. Structurer le site autour des intentions de recherche locales</h3> <p>Si vous desservez plusieurs villes ou quartiers, créez une <strong>architecture de site claire</strong> plutôt que de manipuler le nom d’entreprise :</p> <ul> <li>pages dédiées par <strong>ville</strong> ou <strong>zone</strong> (ex. : <em>/plombier-paris-15</em>, <em>/plombier-boulogne</em>) ;</li> <li>pages détaillant chaque <strong>type de service</strong> (urgence, installation, rénovation, etc.) ;</li> <li>contenus informationnels (guides, FAQ, articles) répondant aux questions fréquentes locales.</li> </ul> <p>Chaque page peut cibler une variation sémantique de vos principales expressions (services + zone) sans que le nom officiel de l’entreprise n’ait besoin de changer. Ce travail on-page influence significativement le SEO local, tout en restant pérenne et sans mettre en péril vos fiches.</p> <h3 id="4-surveiller-et-tester-avec-prudence">4. Surveiller et tester avec prudence</h3> <p>Si vous estimez qu’une <strong>légère optimisation du nom</strong> est justifiée (par exemple, sur une nouvelle fiche pour une enseigne qui inclut déj à un terme métier dans sa signalétique), procédez avec une grande prudence :</p> <ul> <li>préparez des <strong>preuves de légitimité</strong> (photos d’enseigne, extraits de mentions légales, site web aligné) ;</li> <li>évitez les changements répétés et expérimentations constantes sur des fiches déj à anciennes ou bien notées ;</li> <li>surveillez l’impact sur votre visibilité et tout signal de modération (baisse brutale d’impressions, messages de Google, suspension).</li> </ul> <p>Pour une fiche jeune, sans historique et sans avis, un ajustement mesuré est généralement moins risqué que pour une fiche ancienne qui cumule déj à de nombreux avis et de bonnes performances. Dans tous les cas, la stabilité et la cohérence priment sur les gains rapides mais fragiles.</p> <h2 id="outils-et-ressources-pour-gerer-correctement-vos-noms-d-etablissement">Outils et ressources pour gérer correctement vos noms d’établissement</h2> <p>Pour piloter efficacement vos stratégies de SEO local et vérifier l’impact de vos décisions sur les noms d’établissement, plusieurs outils sont particulièrement utiles.</p> <ul> <li><strong>Google Search Console</strong> : permet de suivre les requêtes sur lesquelles votre site apparaît, les pages qui génèrent des clics, et d’identifier les opportunités de contenus locaux à créer ou à améliorer.</li> <li><strong>Google Analytics</strong> : aide à analyser le comportement des visiteurs issus de recherches locales (pages d’entrée, zones géographiques, conversions) et à mesurer l’impact des optimisations réalisées sur votre site.</li> <li><strong>Google Maps et l’interface de gestion de Google Business Profile</strong> : indispensables pour modifier ou vérifier vos informations d’établissement, surveiller les avis, publier des posts et suivre certaines statistiques de visibilité.</li> <li><strong>Outils de recherche de mots-clés</strong> comme AnswerThePublic, Google Keyword Planner ou d’autres solutions spécialisées : utiles pour identifier les questions locales fréquentes et les requêtes associées à vos services et à votre zone.</li> <li><strong>Outils d’audit de site</strong> comme Screaming Frog : permettent d’optimiser la structure de votre site, les balises et la cohérence globale, sans toucher abusivement au nom d’entreprise.</li> <li><strong>Solutions de gestion de présences locales</strong> (par exemple des plateformes dédiées au SEO local) : pratiques pour vérifier l’uniformité du NAP sur des dizaines d’annuaires, corriger les erreurs et surveiller la cohérence de vos noms d’établissement à grandeéchelle.</li> </ul> <p>L’objectif n’est pas de multiplier les outils pour le plaisir, mais de s’assurer que chaque décision concernant le nom de l’entreprise, leséventuelles variantes officielles et les informations locales est basée sur des données réelles et sur une vision globale.</p> <h2 id="questions-frequentes-sur-les-variations-du-nom-d-entreprise-en-seo-local">Questions fréquentes sur les variations du nom d’entreprise en SEO local</h2> <ul> <li><em>Qu’est-ce qu’une variation du nom d’entreprise ?</em><br /> Une variation du nom d’entreprise est une forme alternative de votre nom officiel qui reste cohérente avec votre marque et votre réalité commerciale : version abrégée ouétendue, traduction utilisée dans vos supports, ou nom d’enseigne distinct mais réel pour une activité complémentaire.</li> <li><em>Les variations de nom améliorent-elles automatiquement le référencement local ?</em><br /> Non. Ce qui influe le plus sur le SEO local reste un ensemble de signaux : pertinence du profil, proximité, avis, optimisation on-page, liens, comportement des utilisateurs. Un nom contenant des termes métiers peut aider lorsqu’il est légitime, mais l’ajout artificiel de mots-clés dans le nom va à l’encontre des consignes de Google et peut aboutir à une suspension.</li> <li><em>Puis-je ajouter le nom de ma ville dans le titre de ma fiche Google Business Profile ?</em><br /> Vous ne pouvez le faire que si la ville fait réellement partie du nom de votre enseigne telle qu’elle est utilisée dans la vie courante. Ajouter la ville uniquement pour le référencement est contraire aux règles. Il est préférable d’intégrer la ville dans le contenu de votre site, dans la description de la fiche et dans vos posts plutôt que dans le nom lui-même.</li> <li><em>Comment intégrer des variations liées à ma zone de chalandise sans changer mon nom ?</em><br /> En créant des pages dédiées à chaque ville ou quartier sur votre site, en optimisant vos balises et vos contenus pour ces zones, et en précisant vos secteurs d’intervention dans votre fiche Google Business Profile. Cette stratégie permet de cibler une large gamme de requêtes locales sans toucher au nom officiel de votre entreprise.</li> <li><em>Quels sont les risques si j’abuse des variations de nom dans Google Business Profile ?</em><br /> Un usage excessif de variations artificielles (ajout de mots-clés, répétitions, villes non présentes dans l’enseigne) peut nuire à la cohérence de votre marque, déclencher des corrections automatiques de Google, voire entraîner une suspension de votre fiche avec perteéventuelle de vos avis et de votre historique.</li> <li><em>Comment trouver des idées de formulations locales sans modifier mon nom ?</em><br /> En analysant les requêtes des utilisateurs via des outils de recherche de mots-clés, les données de Google Search Console, les suggestions de Google et les questions fréquentes de votre clientèle. Ces expressions pourrontêtre utilisées dans vos pages de destination, vos articles de blog, vos FAQ et vos posts, sans nécessité de les insérer dans le nom de l’établissement.</li> <li><em>Puis-je avoir plusieurs fiches à la même adresse avec des noms différents ?</em><br /> Oui, mais uniquement si chaque fiche correspond à une entité commerciale distincte, avec une activité clairement différenciée et une enseigne propre. Il ne s’agit pas de créer plusieurs fiches pour la même activité sous des noms légèrement différents, mais de refléter la présence réelle de plusieurs marques ou services autonomes au même lieu.</li> </ul> <h2 id="approche-recommandee-pour-votre-strategie-de-nommage-en-seo-local">Approche recommandée pour votre stratégie de nommage en SEO local</h2> <p>Pour tirer le meilleur parti des variations du nom d’entreprise sans enfreindre les règles ni fragiliser vos fiches, vous pouvez suivre la démarche suivante :</p> <ol> <li><strong>Faire unétat des lieux</strong> : recensez tous les noms actuellement utilisés (raison sociale, enseigne, noms sur le site, sur la vitrine, dans les annuaires). Vérifiez s’ils sont cohérents et si certaines variations sont purement historiques ou marketing.</li> <li><strong>Choisir un nom de référence</strong> : définissez le nom officiel qui sera utilisé comme référence sur votre site, vos fiches locales et vos supports principaux. Ce nom doit refléter la réalité (enseigne, mentions légales) etêtre stable.</li> <li><strong>Aligner toutes les fiches et citations</strong> : mettez à jour vos profils Google Business Profile, annuaires et réseaux sociaux pour qu’ils utilisent ce même nom, en corrigeant les variantes inutiles ou obsolètes.</li> <li><strong>Créer des contenus optimisés autour de ce nom</strong> : travaillez vos pages locales, vos descriptions, vos articles et vos posts pour intégrer les variantes de requêtes (métiers + zones), plutôt que de modifier le nom lui-même.</li> <li><strong>Documenter toute variation légitime</strong> : si vous devez utiliser une version différente du nom (marque secondaire, enseigne spécifique), assurez-vous qu’elle est visible physiquement et juridiquement, puis conservez des preuves (photos, documents officiels) en cas de contrôle.</li> <li><strong>Surveiller les performances et la conformité dans la durée</strong> : utilisez les statistiques de Google Business Profile, Google Search Console et Analytics pour suivre l’effet de vos optimisations locales, et restez informé des mises à jour de consignes Google afin d’ajuster vos pratiques sans risque.</li> </ol> <p>En adoptant cette approche, les variations de nom cessent d’être un outil de manipulation à court terme et deviennent un <strong>levier maîtrisé</strong>, au service de votre identité de marque et de votre visibilité locale à long terme.</p> <p>N’hésitez pas à solliciter un expert SEO local si vous envisagez un changement de nom d’enseigne, une refonte de votre architecture locale ou la création de nombreuses fiches pour un réseau multi-établissements. Une stratégie de nommage bien pensée en amontévite de nombreux problèmes de cohérence, de référencement et de conformité par la suite.</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/seo-local-et-variations-de-telephone-concept-enjeux-et-bonnes-pratiques/" 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">SEO Local et Variations de Téléphone : Concept, Enjeux et Bonnes Pratiques</span> </a> <a href="/blog/seo-local-et-transcription-des-appels-concept-methode-et-bonnes-pratiques/" 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">SEO Local et Transcription des Appels : Concept, Méthode et Bonnes Pratiques</span> </a> <a href="/blog/seo-local-click-and-collect-concept-strategies-et-bonnes-pratiques/" 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">SEO Local Click and Collect : Concept, Stratégies et Bonnes Pratiques</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="seo-local-et-variations-du-nom-d-entreprise-concept-risques-et-bonnes-pratiques"> <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 = 'seo-local-et-variations-du-nom-d-entreprise-concept-risques-et-bonnes-pratiques'; // 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="/#brands" class="hover:text-white transition text-sm">Nos marques</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">© 2025 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 cardsPerView = { mobile: 1, tablet: 2, desktop: 3, large: 4 }; function getCardsPerView() { const width = window.innerWidth; if (width >= 1280) return cardsPerView.large; if (width >= 1024) return cardsPerView.desktop; if (width >= 768) return cardsPerView.tablet; return cardsPerView.mobile; } function updateCarousel() { const cardsPerViewCount = getCardsPerView(); const containerWidth = brandsCarousel.offsetWidth; const cardWidth = containerWidth / cardsPerViewCount; const maxIndex = Math.max(0, cards.length - cardsPerViewCount); currentIndex = Math.min(currentIndex, maxIndex); brandsContainer.style.transform = `translateX(-${currentIndex * cardWidth}px)`; // Update button states const isAtStart = currentIndex === 0; const isAtEnd = currentIndex >= maxIndex; if (brandsPrevBtn) { brandsPrevBtn.style.opacity = isAtStart ? '0.5' : '1'; brandsPrevBtn.style.cursor = isAtStart ? 'not-allowed' : 'pointer'; } if (brandsNextBtn) { brandsNextBtn.style.opacity = isAtEnd ? '0.5' : '1'; brandsNextBtn.style.cursor = isAtEnd ? 'not-allowed' : 'pointer'; } if (brandsPrevBtnMobile) { brandsPrevBtnMobile.style.opacity = isAtStart ? '0.5' : '1'; brandsPrevBtnMobile.style.cursor = isAtStart ? 'not-allowed' : 'pointer'; } if (brandsNextBtnMobile) { brandsNextBtnMobile.style.opacity = isAtEnd ? '0.5' : '1'; brandsNextBtnMobile.style.cursor = isAtEnd ? 'not-allowed' : 'pointer'; } } function nextSlide() { const cardsPerViewCount = getCardsPerView(); const maxIndex = Math.max(0, cards.length - cardsPerViewCount); if (currentIndex < maxIndex) { currentIndex++; updateCarousel(); } } function prevSlide() { if (currentIndex > 0) { currentIndex--; updateCarousel(); } } // Event listeners if (brandsNextBtn) brandsNextBtn.addEventListener('click', nextSlide); if (brandsPrevBtn) brandsPrevBtn.addEventListener('click', prevSlide); if (brandsNextBtnMobile) brandsNextBtnMobile.addEventListener('click', nextSlide); if (brandsPrevBtnMobile) brandsPrevBtnMobile.addEventListener('click', prevSlide); // Set responsive width for cards function setCardWidths() { const cardsPerViewCount = getCardsPerView(); const containerWidth = brandsCarousel.offsetWidth; const gap = 24; // 24px gap const cardWidth = (containerWidth - (gap * (cardsPerViewCount - 1))) / cardsPerViewCount; cards.forEach(card => { card.style.width = `${cardWidth}px`; card.style.flexShrink = '0'; }); } // Initialize setCardWidths(); updateCarousel(); // Update on resize 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>