Article SEO SEO Technique

Agence SEO Saint-Jean-des-Vignes

Agence SEO Saint-Jean-des-Vignes : guide complet pour doper votre visibilité locale

Introduction

En 2025, la concurrence sur Internet est plus féroce que jamais. Pour qu’une entreprise située à Saint-Jean-des-Vignes ou dans ses environs se démarque et attire des clients, il est indispensable de s’appuyer sur une stratégie de référencement naturel solide. Une agence SEO intervenant à Saint-Jean-des-Vignes peut vous accompagner pour améliorer la visibilité de votre site web, renforcer votre présence locale et développer un flux régulier de prospects qualifiés.

Ce guide ne présente pas une agence portant officiellement le nom « Agence SEO Saint-Jean-des-Vignes » – il s’agit d’un guide pratique sur le SEO local destiné aux entreprises de la commune et de la zone géographique voisine. Vous y découvrirez :

  • les concepts clés du SEO et du référencement local ;
  • les bonnes pratiques à mettre en place sur votre site ;
  • les outils incontournables pour piloter votre stratégie ;
  • la manière de choisir une agence SEO proche de Saint-Jean-des-Vignes ;
  • une FAQ détaillée pour répondre aux questions les plus fréquentes des dirigeants locaux.

L’objectif est de vous fournir un contenu concret, actionnable et adapté aux enjeux d’une entreprise locale en quête de visibilité sur Google.

Concepts clés du SEO et du référencement local

Le SEO (Search Engine Optimization) désigne l’ensemble des techniques permettant d’améliorer le positionnement d’un site web dans les résultats des moteurs de recherche, en particulier Google. Pour une entreprise basée à Saint-Jean-des-Vignes, le SEO se décline en deux volets principaux :

  • le référencement naturel général, qui vise à se positionner sur des requêtes liées à vos produits ou services, sans notion géographique ;
  • le SEO local, qui cherche à vous rendre visible lorsque les internautes tapent des requêtes intégrant une dimension locale, comme « artisan Saint-Jean-des-Vignes », « plombier près de Saint-Jean-des-Vignes » ou encore « agence SEO Saint-Jean-des-Vignes ».

Qu’est-ce que le SEO local ?

Le référencement local consiste à optimiser votre présence en ligne pour les recherches effectuées dans une zone géographique précise. Pour une entreprise de Saint-Jean-des-Vignes, cela signifie apparaître :

  • dans le pack local de Google (les résultats avec carte et fiches d’établissements) ;
  • dans Google Maps lorsque les internautes recherchent un service à proximité ;
  • dans les résultats organiques classiques, mais pour des requêtes incluant la localisation (commune, département, secteur, agglomération la plus proche).

Les facteurs clés du SEO local

Plusieurs éléments influencent votre visibilité locale :

  • Fiche d’établissement Google (anciennement Google My Business) : créer et optimiser votre fiche est essentiel. Elle doit comporter votre nom, votre adresse, votre numéro de téléphone, vos horaires, une description de vos services, des photos et, si possible, des posts réguliers.
  • NAP cohérent (Name, Address, Phone) : vos coordonnées doivent être identiques sur votre site, sur votre fiche Google et sur les annuaires en ligne.
  • Avis clients : la quantité, la note moyenne et la fraîcheur des avis influencent la confiance des internautes et, indirectement, votre visibilité.
  • Contenu localisé : votre site doit contenir des pages ou des sections dédiées à votre zone d’intervention, avec une rédaction qui reflète réellement votre ancrage local.
  • Liens entrants locaux : obtenir des liens depuis des sites de la région (associations, partenaires, médias locaux, annuaires professionnels) renforce votre légitimité géographique.

Rôle d’une agence SEO pour une entreprise de Saint-Jean-des-Vignes

Une agence SEO qui travaille avec des clients à Saint-Jean-des-Vignes ne se limite pas à insérer quelques mots-clés dans vos textes. Son rôle consiste notamment à :

  • réaliser un audit SEO complet de votre site (technique, contenu, popularité) ;
  • analyser votre positionnement local et celui de vos concurrents ;
  • définir une stratégie de mots-clés incluant des requêtes locales comme « entreprise + Saint-Jean-des-Vignes », « service + ville proche », etc. ;
  • optimiser la structure de votre site pour faciliter l’indexation par Google ;
  • mettre en place ou optimiser votre fiche d’établissement Google ;
  • vous accompagner sur la collecte et la gestion des avis clients ;
  • suivre, mois après mois, l’évolution de vos positions et de votre trafic organique.

Bonnes pratiques SEO pour les entreprises de Saint-Jean-des-Vignes

Optimiser son site web pour le SEO est un travail régulier qui implique la technique, le contenu et la notoriété. Voici les bonnes pratiques essentielles à mettre en place, que vous travailliez avec une agence SEO ou que vous gériez une partie du référencement en interne.

1. Optimiser le contenu pour un public local

Le contenu reste le pilier central de toute stratégie SEO. Pour une entreprise de Saint-Jean-des-Vignes, il doit être à la fois pertinent pour votre audience et optimisé pour les moteurs de recherche.

  • Créer des pages de services détaillées : pour chaque prestation importante, prévoyez une page dédiée qui explique clairement ce que vous proposez, à qui cela s’adresse, et dans quelle zone vous intervenez.
  • Intégrer des éléments locaux : mentionner votre localisation, vos zones d’intervention, des références clients locales, voire des événements auxquels vous participez dans le secteur.
  • Rédiger des articles de blog : par exemple, « Comment choisir son artisan à Saint-Jean-des-Vignes », « Les enjeux du numérique pour les petites entreprises près de Saint-Jean-des-Vignes », etc.
  • Utiliser des mots-clés pertinents : intégrer naturellement des expressions comme « agence SEO Saint-Jean-des-Vignes », « référencement local pour PME près de Saint-Jean-des-Vignes », « stratégie SEO locale » ou encore « visibilité sur Google dans le Rhône » dans vos textes, titres et sous-titres.

2. Améliorer la structure et l’architecture du site

Une architecture claire et bien organisée facilite à la fois la navigation des internautes et le travail des robots des moteurs de recherche.

  • Menu simple et logique : vos pages principales doivent être accessibles en quelques clics (ex. : Accueil, Services, À propos, Zone d’intervention, Blog, Contact).
  • URLs lisibles : privilégiez des adresses claires, par exemple /services/seo-local-saint-jean-des-vignes plutôt que des URL remplies de paramètres techniques.
  • Balises HTML optimisées : chaque page doit contenir un </code> unique, une <code><meta description></code> attractive et une structure de titres logique (<code><h1></code>, <code><h2 id="etc-maillage-interne-creez-des-liens-entre-vos-pages-pour-aider-google-a-comprendre-la-hierarchie-de"></code>, <code><h3></code>, etc.).</li> <li><strong>Maillage interne</strong> : créez des liens entre vos pages pour aider Google à comprendre la hiérarchie de votre contenu et pour guider vos visiteurs vers les informations importantes.</li> </ul> <h3>3. Intégrer les mots-clés de façon naturelle</h2> <p>Les mots-clés comme « <strong>agence SEO Saint-Jean-des-Vignes</strong> », « <strong>consultant SEO local</strong> » ou « <strong>référencement naturel pour artisans</strong> » doivent être intégrés sans sur-optimisation. Une bonne pratique consiste à :</p> <ul> <li>les utiliser dans le <strong>titre principal</strong> de la page ;</li> <li>les placer dans un ou plusieurs <strong>sous-titres</strong> ;</li> <li>les inclure à plusieurs reprises dans le corps du texte, de manière fluide et pertinente ;</li> <li>les ajouter dans les attributs <code>alt</code> de certaines images lorsque cela a du sens.</li> </ul> <p>L’objectif est de montrer à Google que la page traite réellement du sujet, tout en restant agréable à lire pour vos visiteurs.</p> <h3 id="4-adopter-une-approche-mobile-first">4. Adopter une approche mobile-first</h3> <p>La majorité des recherches locales sont effectuées sur smartphone. Il est donc impératif que votre site soit <strong>adapté aux mobiles</strong> :</p> <ul> <li>design <strong>responsive</strong> qui s’adapte à tous les écrans ;</li> <li>temps de chargement rapide, y compris sur une connexion mobile moyenne ;</li> <li>menus et boutons facilement cliquables avec le doigt ;</li> <li>formulaires simples à remplir depuis un téléphone.</li> </ul> <p>Google prend en compte l’expérience mobile pour classer les sites : un site lent ou mal adapté aux smartphones peut être pénalisé.</p> <h3 id="5-travailler-la-popularite-et-les-avis">5. Travailler la popularité et les avis</h3> <p>Le SEO ne se joue pas uniquement sur votre site. La manière dont le reste du web parle de vous compte énormément :</p> <ul> <li><strong>Collecter des avis réguliers</strong> sur votre fiche d’établissement Google et sur d’autres plateformes pertinentes dans votre secteur.</li> <li><strong>Répondre à tous les avis</strong>, positifs comme négatifs, avec professionnalisme.</li> <li><strong>Développer des partenariats locaux</strong> : associations, clubs, événements, presse régionale… qui peuvent mentionner votre entreprise et faire un lien vers votre site.</li> <li><strong>S’inscrire dans des annuaires de qualité</strong>, notamment ceux qui sont reconnus dans votre domaine d’activité.</li> </ul> <h2 id="outils-et-ressources-pour-piloter-votre-strategie-seo-locale">Outils et ressources pour piloter votre stratégie SEO locale</h2> <p>Pour mettre en œuvre et suivre une stratégie SEO efficace, certains outils sont particulièrement utiles. Une <strong>agence SEO intervenant à Saint-Jean-des-Vignes</strong> les utilise au quotidien, mais vous pouvez également vous en servir en interne pour mieux comprendre vos performances.</p> <h3 id="outils-indispensables">Outils indispensables</h3> <ul> <li><strong>Google Search Console</strong> : cet outil gratuit permet de suivre la façon dont Google voit votre site. Vous pouvez y analyser les requêtes qui génèrent des impressions et des clics, vérifier l’indexation de vos pages, détecter des erreurs techniques et envoyer un sitemap.</li> <li><strong>Google Analytics</strong> : il vous permet de comprendre d’où viennent vos visiteurs (référencement naturel, campagnes publicitaires, réseaux sociaux, etc.), quelles pages ils consultent, et comment ils interagissent avec votre site.</li> <li><strong>Outils de suivi de mots-clés</strong> (comme Semrush, Ahrefs, SE Ranking, etc.) : ils servent à monitorer votre position sur certaines requêtes stratégiques, à analyser vos concurrents et à identifier de nouveaux mots-clés à fort potentiel.</li> <li><strong>Fiche d’établissement Google</strong> : au-delà d’un simple annuaire, c’est un outil de pilotage de votre visibilité locale. Vous pouvez y publier des actualités, répondre aux avis et ajuster vos informations pratiques.</li> </ul> <h3 id="ressources-complementaires-utiles">Ressources complémentaires utiles</h3> <ul> <li><strong>Blogs spécialisés SEO</strong> : pour suivre les évolutions des algorithmes et des bonnes pratiques.</li> <li><strong>Guides officiels des moteurs de recherche</strong> : les bonnes pratiques publiées par Google restent une référence pour développer un site sain sur le long terme.</li> <li><strong>Formations en ligne</strong> : de nombreuses plateformes proposent des initiations au SEO, utiles pour dialoguer plus efficacement avec votre agence SEO ou votre consultant.</li> </ul> <h2 id="choisir-une-agence-seo-pour-votre-entreprise-a-saint-jean-des-vignes">Choisir une agence SEO pour votre entreprise à Saint-Jean-des-Vignes</h2> <p>Il n’existe pas, à ce jour, d’agence officiellement connue sous le nom exact « Agence SEO Saint-Jean-des-Vignes ». En pratique, les entreprises locales font appel :</p> <ul> <li>soit à des <strong>agences web et SEO régionales</strong> qui couvrent la zone de Saint-Jean-des-Vignes ;</li> <li>soit à des <strong>agences nationales</strong> capables de travailler à distance, tout en intégrant les enjeux locaux dans leur stratégie.</li> </ul> <h3 id="criteres-de-selection-d-une-agence-seo-locale">Critères de sélection d’une agence SEO locale</h3> <p>Pour choisir une agence adaptée à vos besoins, plusieurs critères doivent être examinés :</p> <ul> <li><strong>Expérience en SEO local</strong> : assurez-vous que l’agence a déjà accompagné des TPE/PME sur des problématiques de référencement local (fiches d’établissement, avis, contenus géolocalisés).</li> <li><strong>Références clients</strong> : demandez des exemples concrets de projets, idéalement dans votre secteur d’activité ou dans une zone géographique proche.</li> <li><strong>Transparence de la méthodologie</strong> : une bonne agence explique clairement ce qu’elle va mettre en place, les priorités et les indicateurs de suivi.</li> <li><strong>Suivi régulier</strong> : privilégiez un accompagnement mensuel avec rapports, plutôt qu’une intervention ponctuelle sans suivi.</li> <li><strong>Qualité de la communication</strong> : un interlocuteur disponible, pédagogue et réactif est un atout pour faire évoluer votre stratégie dans la durée.</li> </ul> <h3 id="exemples-de-prestations-proposees-par-une-agence">Exemples de prestations proposées par une agence</h3> <p>Une agence SEO qui accompagne des entreprises de Saint-Jean-des-Vignes peut proposer notamment :</p> <ul> <li>un <strong>audit SEO complet</strong> (technique, sémantique, popularité) ;</li> <li>la <strong>création ou refonte de site web optimisé</strong> pour le SEO ;</li> <li>la <strong>mise en place d’une stratégie de contenu</strong> (articles de blog, pages de services, contenus locaux) ;</li> <li>l’<strong>optimisation technique</strong> (vitesse de chargement, balises, maillage interne, expérience mobile) ;</li> <li>l’<strong>optimisation de votre fiche d’établissement Google</strong> et de vos présences sur les annuaires ;</li> <li>le <strong>suivi des performances</strong> (rapports de positions, trafic, conversions) avec recommandations d’ajustement.</li> </ul> <h2 id="etapes-pour-lancer-votre-strategie-seo-a-saint-jean-des-vignes">Étapes pour lancer votre stratégie SEO à Saint-Jean-des-Vignes</h2> <p>Que vous fassiez appel à une agence ou non, voici un plan d’action structuré pour démarrer ou renforcer votre SEO local.</p> <h3 id="etape-1-analyse-de-la-situation-actuelle">Étape 1 : analyse de la situation actuelle</h3> <ul> <li>Listez vos <strong>sources de clients actuelles</strong> (bouche-à-oreille, réseaux sociaux, publicité, etc.).</li> <li>Identifiez vos <strong>forces et faiblesses en ligne</strong> : site non mis à jour, absence d’avis, pas de fiche d’établissement, etc.</li> <li>Vérifiez si votre entreprise apparaît lorsque vous tapez des requêtes comme « votre métier + Saint-Jean-des-Vignes » ou « votre métier + ville voisine ».</li> </ul> <h3 id="etape-2-optimisation-de-la-base-technique">Étape 2 : optimisation de la base technique</h3> <ul> <li>Assurez-vous que votre site est <strong>sécurisé en HTTPS</strong> et qu’il se charge rapidement.</li> <li>Contrôlez son <strong>affichage sur mobile</strong> et corrigez les éléments qui posent problème (texte trop petit, menus difficiles à utiliser, etc.).</li> <li>Créez un <strong>sitemap XML</strong> et un <strong>fichier robots.txt</strong>, puis soumettez votre site à Google via la Search Console.</li> </ul> <h3 id="etape-3-creation-et-optimisation-de-la-fiche-d-etablissement">Étape 3 : création et optimisation de la fiche d’établissement</h3> <ul> <li>Créez ou revendiquez votre fiche d’établissement Google.</li> <li>Renseignez <strong>toutes les informations</strong> : catégories, description, horaires, services, photos de qualité.</li> <li>Invitez vos clients satisfaits à laisser un <strong>avis détaillé</strong> sur votre fiche.</li> </ul> <h3 id="etape-4-strategie-de-contenu-localise">Étape 4 : stratégie de contenu localisé</h3> <ul> <li>Identifiez les <strong>questions fréquentes</strong> de vos clients à Saint-Jean-des-Vignes et dans les communes voisines.</li> <li>Créez des pages ou des articles qui répondent précisément à ces besoins, en intégrant votre localisation lorsque cela fait sens.</li> <li>Mettez en avant vos <strong>réalisations locales</strong> : études de cas, témoignages clients, photos de chantiers ou de projets dans la région.</li> </ul> <h3 id="etape-5-suivi-et-amelioration-continue">Étape 5 : suivi et amélioration continue</h3> <ul> <li>Suivez régulièrement vos <strong>positions sur les mots-clés principaux</strong>, votre trafic organique et les demandes de contact générées par le site.</li> <li>Ajustez vos contenus en fonction de ce qui fonctionne le mieux.</li> <li>Continuez à <strong>collecter des avis</strong> et à renforcer vos liens locaux.</li> </ul> <h2 id="faq-agence-seo-et-referencement-local-a-saint-jean-des-vignes">FAQ – Agence SEO et référencement local à Saint-Jean-des-Vignes</h2> <p>Pour répondre aux principales questions que se posent les entrepreneurs et responsables marketing de Saint-Jean-des-Vignes, voici une foire aux questions détaillée.</p> <ul> <li> <strong>Qu’est-ce qu’une agence SEO ?</strong><br /> Une agence SEO est une entreprise spécialisée dans l’optimisation des sites web pour les moteurs de recherche. Elle met en place des stratégies techniques, éditoriales et de popularité pour améliorer le positionnement d’un site dans les résultats de Google et générer un trafic qualifié. </li> <li> <strong>Existe-t-il une agence nommée « Agence SEO Saint-Jean-des-Vignes » ?</strong><br /> À ce jour, il n’existe pas d’agence officiellement connue sous la dénomination exacte « Agence SEO Saint-Jean-des-Vignes ». En revanche, plusieurs agences web et SEO régionales ou nationales accompagnent des entreprises situées à Saint-Jean-des-Vignes et dans les communes environnantes. </li> <li> <strong>Pourquoi choisir un SEO local quand on est une entreprise de Saint-Jean-des-Vignes ?</strong><br /> Le SEO local permet de cibler en priorité les internautes situés dans votre zone de chalandise, ceux qui sont les plus susceptibles de devenir vos clients. En optimisant votre présence pour des recherches de proximité, vous augmentez vos chances d’apparaître dans le pack local de Google, sur Google Maps et sur des requêtes intégrant la dimension géographique (ville, secteur, département). </li> <li> <strong>Combien coûte une prestation d’agence SEO ?</strong><br /> Le coût d’un accompagnement SEO varie en fonction de plusieurs facteurs : taille de votre site, niveau de concurrence sur vos mots-clés, objectifs (local, national, e-commerce), et durée de la mission. En pratique, une petite entreprise peut trouver des prestations d’audit ou de démarrage de stratégie à partir de quelques centaines d’euros, tandis qu’un accompagnement mensuel complet se chiffre souvent en plusieurs centaines, voire milliers d’euros par mois selon l’ampleur du projet. L’important est de raisonner en retour sur investissement plutôt qu’en coût brut. </li> <li> <strong>Combien de temps faut-il pour voir des résultats en SEO ?</strong><br /> Le SEO est une stratégie de moyen et long terme. Dans un contexte local peu concurrentiel, les premières améliorations de positionnement peuvent apparaître en quelques semaines, mais il faut généralement plusieurs mois pour obtenir des résultats solides et durables. Le référencement naturel se construit progressivement : plus votre site gagne en qualité et en notoriété, plus il devient performant. </li> <li> <strong>Une petite entreprise de Saint-Jean-des-Vignes peut-elle gérer son SEO seule ?</strong><br /> Oui, il est possible de mettre en place certaines actions de base en interne : création de la fiche d’établissement Google, collecte d’avis, rédaction de contenus, améliorations simples du site. Cependant, pour aller plus loin (audit technique poussé, stratégie de contenu avancée, gestion de sites complexes), l’accompagnement par une agence SEO ou un consultant expérimenté apporte généralement de meilleurs résultats et permet d’éviter des erreurs coûteuses. </li> <li> <strong>Quelle est la différence entre SEO et publicité payante (SEA) ?</strong><br /> Le <strong>SEO</strong> repose sur l’optimisation de votre site pour apparaître naturellement dans les résultats de recherche. Le <strong>SEA</strong> (Search Engine Advertising) correspond aux annonces payantes, généralement affichées en haut des résultats avec la mention « Annonce ». Le SEO demande du temps mais construit une visibilité durable, tandis que la publicité payante offre des résultats rapides tant que vous continuez à payer. Les deux approches sont complémentaires. </li> <li> <strong>Le SEO est-il réservé aux grandes entreprises ?</strong><br /> Non, le référencement naturel est particulièrement intéressant pour les <strong>TPE, PME, artisans, commerçants et professions libérales</strong>. Un site bien optimisé, même modeste, peut générer un flux régulier de contacts qualifiés à l’échelle locale. L’enjeu est d’adapter la stratégie à la taille de l’entreprise et à son budget. </li> <li> <strong>Comment savoir si une agence SEO est sérieuse ?</strong><br /> Plusieurs signaux peuvent vous guider : transparence sur la méthodologie, absence de promesses irréalistes (« 1re place garantie en quelques jours »), exemples concrets de résultats obtenus pour d’autres clients, qualité du diagnostic initial, contrats clairs et lisibles, suivi régulier avec des rapports compréhensibles. Une agence sérieuse vous parle d’objectifs raisonnables, de progression et d’indicateurs de performance, plutôt que de garanties absolues. </li> <li> <strong>Dois-je forcément refaire mon site pour améliorer mon SEO ?</strong><br /> Pas forcément. Dans certains cas, une <strong>optimisation du site existant</strong> (amélioration technique, réécriture de contenus, meilleure structure) peut suffire pour obtenir de bons résultats. Cependant, si votre site est très ancien, non responsive, lent ou difficile à faire évoluer, une refonte partielle ou totale accompagnée par une agence spécialisée peut s’avérer plus efficace à moyen terme. </li> <li> <strong>Le SEO local est-il utile si je vends en ligne partout en France ?</strong><br /> Oui, car votre ancrage local peut devenir un <strong>levier de confiance</strong>. Même si vous livrez partout en France, mettre en avant votre base à Saint-Jean-des-Vignes et dans sa région rassure les internautes, surtout pour les achats impliquant un certain engagement (services, prestations sur mesure, paniers moyens élevés). De plus, le SEO local peut vous permettre de dominer plus facilement des requêtes géolocalisées, moins concurrentielles que les termes génériques nationaux. </li> </ul> <p>En appliquant ces conseils et, le cas échéant, en vous faisant accompagner par une <strong>agence SEO maîtrisant les enjeux locaux autour de Saint-Jean-des-Vignes</strong>, vous disposerez d’une base solide pour développer votre visibilité en ligne, attirer plus de clients qualifiés et renforcer durablement votre présence sur votre marché.</p> </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="agence-seo-saint-jean-des-vignes"> <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 = 'agence-seo-saint-jean-des-vignes'; // 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>