Publié le 5 mars 2026 SEO Technique

Off-Page SEO Sponsored Link Lien sponsorisé Type

Off-Page SEO, liens sponsorisés et netlinking : guide complet

Introduction

L'optimisation pour les moteurs de recherche (SEO) est une discipline essentielle pour améliorer la visibilité d'un site web sur Internet. Parmi les différentes techniques SEO, le SEO off-page joue un rôle clé en influençant le classement des pages web à travers des facteurs externes : backlinks, notoriété de marque, avis, citations, relations presse, réseaux sociaux, etc.

Dans ce contexte, il est crucial de bien distinguer :

  • Le SEO off-page : toutes les actions réalisées en dehors de votre site pour améliorer votre visibilité organique (backlinks, mentions, e-réputation).
  • Les liens sponsorisés : liens payants (publicité, partenariats, articles sponsorisés, bannières…) qui doivent être correctement balisés et ne sont pas, en eux-mêmes, un facteur direct de classement organique.

Cet article explore en profondeur le rôle des liens (naturels et sponsorisés) dans le cadre du SEO off-page. Nous verrons :

  • ce qu’est réellement un lien sponsorisé au sens SEO,
  • les différents types de liens utiles en off-page,
  • les bonnes pratiques pour utiliser des liens sponsorisés sans risquer de pénalité,
  • les stratégies de netlinking et d’e-réputation,
  • les outils indispensables pour mesurer et piloter vos actions off-page.

Concepts clés

Qu'est-ce que le SEO off-page ?

Le SEO off-page (ou référencement externe) désigne l’ensemble des actions menées en dehors de votre site web pour améliorer son positionnement dans les moteurs de recherche. Il s’agit principalement de signaux comme :

  • les backlinks (liens entrants) provenant d’autres sites ;
  • les mentions de marque (avec ou sans lien) sur des sites tiers et les réseaux sociaux ;
  • les avis clients et notations sur des plateformes spécialisées ;
  • les citations locales (annuaires, fiches locales, données NAP cohérentes) ;
  • les relations presse digitales et le marketing d’influence ;
  • la réputation globale de votre entreprise en ligne.

Contrairement au SEO on-page (contenu, balises, structure, performances techniques), le SEO off-page repose largement sur la manière dont d’autres sites et plateformes perçoivent et recommandent votre site. Il contribue directement à l’autorité, à la confiance et à la popularité de votre domaine.

Qu'est-ce qu’un lien sponsorisé en SEO ?

En SEO, un lien sponsorisé est un lien hypertexte obtenu dans le cadre d’une relation commerciale ou contractuelle (achat, partenariat, article sponsorisé, placement produit, bannière, lien d’affiliation, etc.). Il s’oppose aux liens dits « naturels », qui sont créés spontanément par d’autres éditeurs sans contrepartie directe.

Il est important de ne pas confondre :

  • Liens sponsorisés publicitaires : annonces payantes (Google Ads, Bing Ads, publicité sur les réseaux sociaux, display). Ils relèvent de la publicité en ligne et du SEA, pas du SEO.
  • Liens sponsorisés éditoriaux : articles sponsorisés, partenariats, contenus de marque, liens achetés ou négociés sur des sites tiers. C’est sur ce type de liens que les règles de Google en matière de balisage sont essentielles.

Du point de vue des consignes pour les webmasters, tout lien obtenu contre rémunération ou avantage doit être clairement signalé par des attributs tels que rel="sponsored" ou rel="nofollow". Ce balisage indique aux moteurs de recherche qu’il s’agit d’un lien payant qui ne doit pas être comptabilisé comme un vote « naturel » dans le calcul du classement.

Les différents types de liens dans une stratégie off-page

Pour clarifier les notions et éviter les confusions, il est plus pertinent de parler de types de liens off-page que de se limiter à la notion de lien sponsorisé.

1. Liens éditoriaux naturels

Ce sont les liens obtenus spontanément, sans contrepartie directe, parce que votre contenu est jugé utile ou digne d’être cité. Par exemple :

  • un blog qui cite votre étude ou votre guide ;
  • un site de presse qui reprend vos données ou vous mentionne comme expert ;
  • un partenaire qui vous recommande dans une liste de ressources.

Ces liens éditoriaux naturels sont le cœur du netlinking de qualité et constituent l’un des signaux off-page les plus puissants.

2. Liens sponsorisés et partenariats

Les liens issus de partenariats commerciaux (articles sponsorisés, liens achetés, bannières, liens d’affiliation) doivent être considérés avant tout comme des leviers de visibilité, de trafic et de notoriété. Pour rester conformes aux règles des moteurs de recherche, ils doivent être balisés avec des attributs adaptés, typiquement :

  • rel="sponsored" pour les liens issus d’un partenariat commercial ou d’une publicité ;
  • rel="nofollow" lorsqu’on ne souhaite pas transmettre de signal de recommandation.

Ces liens peuvent générer du trafic qualifié, développer la notoriété de marque et indirectement favoriser l’obtention de nouveaux liens naturels (par exemple, lorsqu’un article sponsorisé très visible est repris ensuite naturellement par d’autres sites).

3. Liens contextuels

On parle de liens contextuels lorsqu’un lien est intégré directement dans le corps d’un contenu éditorial, au sein d’un paragraphe lié au sujet. Ce type de lien, lorsqu’il est naturel et en dofollow, est très apprécié en SEO car il est :

  • pertinent pour l’utilisateur ;
  • pertinent pour le contexte sémantique ;
  • souvent perçu comme un signal fort par les moteurs de recherche.

4. Liens image

Les liens image sont des liens placés sur des visuels (logos, bannières, illustrations, infographies). L’attribut alt de l’image joue alors le rôle de texte d’ancre implicite. L à encore, ils peuvent être :

  • naturels (logo de partenaire, citation dans une infographie) ;
  • ou sponsorisés (bannières publicitaires, encarts payants).

5. Liens sociaux

Les liens sociaux correspondent aux liens et partages issus des plateformes sociales (Facebook, Instagram, LinkedIn, X, TikTok, etc.). La plupart de ces liens sont en nofollow ou balisés de manière à ne pas transmettre directement de PageRank, mais ils sont très utiles pour :

  • générer du trafic ;
  • accroître la notoriété de marque ;
  • favoriser la diffusion du contenu et, par ricochet, l’obtention de backlinks éditoriaux sur des sites tiers.

Liens sponsorisés et SEO : ce qu’il faut vraiment comprendre

Les liens sponsorisés ne sont pas un facteur de classement direct

Contrairement à une idée reçue, acheter des liens sponsorisés ou des annonces ne permet pas d’améliorer directement le référencement naturel de votre site. Les systèmes publicitaires (comme Google Ads) et l’algorithme de classement organique fonctionnent de manière séparée.

Cependant, une stratégie combinant publicité payante et SEO off-page peut produire des effets indirects intéressants :

  • plus de visibilité sur votre marque et votre contenu ;
  • plus de recherches de marque et de trafic direct ;
  • plus de probabilités que des éditeurs découvrent votre contenu et créent ensuite des liens naturels.

Pourquoi et comment baliser les liens sponsorisés

Tout lien obtenu dans un cadre payant doit être clairement indiqué comme tel à la fois pour des raisons de transparence vis-à-vis de l’utilisateur et pour respecter les consignes des moteurs de recherche. En pratique :

  • Articles sponsorisés : les liens sortants doivent comporter rel="sponsored" et/ou rel="nofollow".
  • Bannières publicitaires et encarts : même principe, les liens ne doivent pas être considérés comme des recommandations naturelles.
  • Liens d’affiliation : l’usage de rel="sponsored" est recommandé.

Ne pas baliser correctement des liens achetés dans l’objectif de manipuler le classement peut entraîner des pénalités algorithmiques ou manuelles, voire une dégradation durable de la visibilité de votre site.

Risques liés à l’achat de liens pour le SEO

Une stratégie qui repose principalement sur l’achat massif de liens en dofollow, sans transparence ni balisage adapté, présente plusieurs risques :

  • profils de liens artificiels détectés par les moteurs ;
  • backlinks provenant de sites de faible qualité ou de réseaux de blogs privés ;
  • ancres sur-optimisées répétées (exact match) ;
  • perte de confiance algorithmique dans votre domaine.

À long terme, une telle approche peut conduire à une chute importante de trafic organique. Une stratégie durable privilégie au contraire :

  • la création de contenu de haute qualité ;
  • la construction de relations éditoriales ;
  • le développement de la marque et de la réputation ;
  • un profil de liens varié, naturel et cohérent.

Bonnes pratiques SEO off-page

La première condition pour obtenir des backlinks de qualité est de proposer un contenu suffisamment intéressant pour mériter d’être cité. Parmi les formats qui génèrent le plus de liens naturels, on trouve :

  • les études originales et analyses chiffrées ;
  • les guides complets et dossiers de référence ;
  • les outils gratuits (calculatrices, simulateurs, modèles) ;
  • les infographies et ressources visuelles faciles à réutiliser ;
  • les interviews d’experts et tables rondes.

Les contenus longs et approfondis ont tendance à générer davantage de backlinks et de partages que les contenus très courts, à condition d’être bien structurés, utiles et tenus à jour.

Collaborer avec des influenceurs et créateurs de contenu

Les influenceurs, blogueurs et créateurs de contenu peuvent jouer un rôle central dans votre stratégie off-page. Il ne s’agit pas seulement d’acheter un post sponsorisé, mais de construire des collaborations qui créent de la valeur pour leurs audiences :

  • co-création de contenus (webinaires, vidéos, podcasts, études) ;
  • invitation d’experts pour des interviews sur votre blog ;
  • participation à des événements en ligne (lives, conférences virtuelles) ;
  • programmes d’ambassadeurs de marque.

Ces collaborations peuvent générer à la fois :

  • des liens (sponsorisés ou non) ;
  • des mentions de marque ;
  • des signaux de confiance utiles pour l’E-E-A-T (expérience, expertise, autorité, fiabilité).

Travailler votre présence sur les réseaux sociaux

Même si les signaux sociaux ne sont pas un facteur de classement direct, une présence active et cohérente sur les réseaux sociaux contribue fortement à :

  • diffuser vos contenus auprès d’un public élargi ;
  • générer du trafic récurrent ;
  • augmenter les chances d’obtenir de nouveaux backlinks éditoriaux ;
  • renforcer votre image de marque et votre légitimité.

Les réseaux sociaux sont aussi un excellent endroit pour repérer des opportunités de collaboration, des sujets de contenu à forte demande et des communautés prêtes à relayer vos ressources.

Optimiser votre visibilité locale et vos citations

Pour les entreprises ayant une présence physique ou une clientèle locale, le référencement local est un volet important du SEO off-page :

  • optimisation de votre fiche d’établissement (par exemple Google Business Profile) ;
  • cohérence des informations NAP (Nom, Adresse, Téléphone) sur tous les annuaires ;
  • collecte d’avis clients authentiques sur plusieurs plateformes ;
  • participation à la vie locale (événements, partenariats, sponsoring).

Ces signaux contribuent à la fois à la confiance des utilisateurs et aux signaux de pertinence locale dans les moteurs de recherche.

Soigner vos relations presse digitales

La digital PR est une stratégie off-page particulièrement efficace pour obtenir des liens d’autorité. Elle consiste notamment à :

  • proposer des sujets d’articles ou de tribunes aux médias spécialisés ;
  • partager des études, baromètres ou données exclusives ;
  • réagir rapidement à l’actualité de votre secteur avec des analyses expertes ;
  • entretenir des relations durables avec des journalistes et rédactions.

Les liens obtenus via des médias reconnus ont un poids important, mais même sans lien, une simple mention de votre marque sur un site d’autorité peut renforcer votre crédibilité globale.

Structurer votre site pour maximiser l’impact du SEO off-page

Architecture claire et maillage interne efficace

Un lien externe est d’autant plus utile qu’il pointe vers une page bien intégrée dans l’architecture de votre site. Pour capitaliser sur vos actions off-page :

  • organisez votre site en sections thématiques claires ;
  • mettez en place un maillage interne logique entre vos pages stratégiques ;
  • facilitez la navigation pour l’utilisateur et l’exploration pour les robots ;
  • réduisez le nombre de clics nécessaires pour atteindre vos pages importantes.

Optimiser les URLs, titres et extraits

Lorsque des sites tiers font un lien vers votre contenu, ils sont plus enclins à le faire si la page cible est :

  • clairement positionnée sur un sujet précis ;
  • dotée d’un titre (balise et <h1>)</strong> pertinent et attractif ;</li> <li>pourvue d’une URL lisible et descriptive ;</li> <li>présentée avec un extrait (meta description) convaincant dans les résultats de recherche.</li> </ul> <p>Un bon travail on-page facilite donc la génération de liens off-page, en rendant vos contenus plus « linkables ».</p> <h3 id="appels-a-l-action-et-partage-de-contenus">Appels à l’action et partage de contenus</h3> <p>Enfin, pensez à <strong>faciliter le partage</strong> de vos contenus :</p> <ul> <li>boutons de partage social bien visibles ;</li> <li>modules d’emailing pour envoyer un article ;</li> <li>versions téléchargeables (PDF, modèles, check-lists) ;</li> <li>résumés prêts à être cités (statistiques clés, graphiques, citations).</li> </ul> <p>Plus vos contenus sont simples à partager et à citer, plus vous augmentez vos chances d’obtenir des liens naturels, ce qui reste le cœur du SEO off-page.</p> <h2 id="mesurer-et-piloter-vos-actions-off-page">Mesurer et piloter vos actions off-page</h2> <h3 id="indicateurs-cles-a-suivre">Indicateurs clés à suivre</h3> <p>Pour évaluer l’efficacité de votre stratégie SEO off-page, plusieurs indicateurs sont particulièrement utiles :</p> <ul> <li><strong>Nombre de domaines référents</strong> : combien de sites différents pointent vers votre site.</li> <li><strong>Qualité des backlinks</strong> : autorité des domaines, pertinence thématique, type de liens (éditoriaux, annuaires, forums…).</li> <li><strong>Répartition des ancres</strong> : équilibre entre ancres de marque, ancres génériques et ancres optimisées.</li> <li><strong>Trafic référent</strong> : volume et qualité du trafic provenant des sites qui vous citent.</li> <li><strong>Évolution de la visibilité organique</strong> : positions sur les mots-clés stratégiques, impressions, clics.</li> <li><strong>Volume de recherches de marque</strong> : signe d’une notoriété croissante.</li> <li><strong>Avis et notes</strong> : moyenne des évaluations et nombre d’avis sur les plateformes clés de votre secteur.</li> </ul> <h3 id="outils-utiles-pour-le-seo-off-page">Outils utiles pour le SEO off-page</h3> <p>Plusieurs familles d’outils peuvent vous aider à suivre et améliorer vos actions off-page :</p> <ul> <li><strong>Outils d’analyse de backlinks</strong> : pour analyser les liens entrants, identifier de nouvelles opportunités ou détecter des liens toxiques.</li> <li><strong>Outils d’e-réputation et de veille</strong> : pour suivre les mentions de votre marque, de vos produits ou de vos dirigeants.</li> <li><strong>Outils d’analyse de trafic</strong> : pour mesurer le trafic référent, les conversions issues de certaines sources et le comportement des utilisateurs.</li> <li><strong>Outils de suivi de positions</strong> : pour évaluer l’impact de vos actions off-page sur le classement de vos mots-clés stratégiques.</li> </ul> <h3 id="nettoyer-et-securiser-votre-profil-de-liens">Nettoyer et sécuriser votre profil de liens</h3> <p>Une stratégie off-page mature inclut également un travail de <strong>gestion des risques</strong> :</p> <ul> <li>identifier les liens de faible qualité, spammy ou issus de sites non pertinents ;</li> <li>tenter de faire retirer les liens problématiques lorsqu’ils sont manifestement artificiels ;</li> <li>utiliser, si nécessaire, les mécanismes de désaveu fournis par certains moteurs ;</li> <li>éviter les schémas de liens automatisés, les fermes de liens et les réseaux opaques.</li> </ul> <p>L’objectif est de conserver un profil de liens <strong>cohérent, naturel et défendable</strong> en cas d’audit.</p> <h2 id="evolutions-recentes-e-e-a-t-ia-et-recherches-sans-clic">Évolutions récentes : E-E-A-T, IA et recherches sans clic</h2> <h3 id="role-de-l-e-e-a-t-dans-le-seo-off-page">Rôle de l’E-E-A-T dans le SEO off-page</h3> <p>Les moteurs de recherche accordent une attention croissante aux signaux d’<strong>expérience, expertise, autorité et fiabilité</strong>. Le SEO off-page contribue directement à ces dimensions, notamment par :</p> <ul> <li>les citations dans des sources reconnues ;</li> <li>les avis clients de qualité ;</li> <li>la présence d’experts identifiés et légitimes ;</li> <li>la cohérence et la qualité des informations sur l’ensemble du web.</li> </ul> <p>Un profil de liens et de mentions solide renforce la perception de votre site comme une référence fiable dans son domaine, ce qui devient de plus en plus important dans un contexte de contenus générés massivement par l’IA.</p> <h3 id="ia-generative-contenus-et-visibilite">IA générative, contenus et visibilité</h3> <p>Avec la montée en puissance de l’IA générative dans les moteurs de recherche, certains types de requêtes aboutissent plus souvent à des <strong>résultats sans clic</strong>, où l’utilisateur obtient une réponse directement dans l’interface. Dans ce contexte, le SEO off-page reste important car :</p> <ul> <li>les systèmes d’IA s’appuient sur des contenus de référence et des sources jugées fiables ;</li> <li>les liens et citations provenant de sites d’autorité renforcent la probabilité que vos contenus soient utilisés comme source ;</li> <li>une forte notoriété de marque encourage toujours les utilisateurs à cliquer sur votre site lorsqu’il apparaît.</li> </ul> <h2 id="conclusion-pratique-articuler-liens-sponsorises-et-seo-off-page">Conclusion pratique : articuler liens sponsorisés et SEO off-page</h2> <p>Pour résumer l’approche à adopter :</p> <ul> <li>considérez les <strong>liens sponsorisés</strong> avant tout comme un levier de visibilité, de trafic et de notoriété, non comme un raccourci pour manipuler le référencement naturel ;</li> <li>respectez systématiquement les <strong>bonnes pratiques de balisage</strong> (<code>rel="sponsored"</code>, <code>rel="nofollow"</code>) pour tout lien obtenu contre rémunération ou avantage ;</li> <li>investissez prioritairement dans la <strong>création de contenus remarquables</strong> et la construction de relations éditoriales durables ;</li> <li>mesurez régulièrement l’impact de vos actions off-page sur vos positions, votre trafic référent et votre notoriété de marque ;</li> <li>travaillez votre <strong>e-réputation</strong> et vos signaux d’autorité (E-E-A-T) grâce à des avis, des témoignages, des études et des citations de qualité.</li> </ul> <p>Une stratégie off-page réussie repose ainsi sur l’équilibre entre <strong>liens naturels</strong>, <strong>présence de marque forte</strong> et <strong>utilisation maîtrisée des liens sponsorisés</strong>, dans le respect des consignes des moteurs de recherche et des attentes des utilisateurs.</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/off-page-seo-non-contextual-link-lien-non-contextuel-type/" 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">Off-Page SEO Non-Contextual Link Lien non-contextuel Type</span> </a> <a href="/blog/off-page-seo-high-quality-link-lien-de-qualit-e-type/" 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">Off-Page SEO High-Quality Link Lien de qualité Type</span> </a> <a href="/blog/off-page-seo-interview-link-lien-d-interview-strat-egie/" 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">Off-Page SEO Interview Link Lien d'interview Stratégie</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="off-page-seo-sponsored-link-lien-sponsorise-type"> <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 = 'off-page-seo-sponsored-link-lien-sponsorise-type'; // 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>