Article SEO SEO Technique

Recherche de mots-clés : Head keyword, mot-clé court (1-2 mots)

Sommaire de l'article

Introduction

La recherche de mots-clés est une étape essentielle dans toute stratégie SEO performante. Parmi les différents types de requêtes, les head keywords – aussi appelés mots-clés courts ou mots-clés génériques – occupent une place particulière en raison de leur longueur réduite (généralement 1 à 2 mots), de leur très fort volume de recherche et de leur concurrence élevée. Ces termes sont souvent utilisés pour attirer un public large, renforcer la notoriété de marque et améliorer le positionnement d’un site dans les résultats des moteurs de recherche.

Dans cet article, nous allons détailler en profondeur le concept de head keyword, expliquer comment les intégrer intelligemment à votre stratégie SEO, montrer comment les combiner avec des mots-clés de longue traîne, et présenter les meilleurs outils pour mener une recherche de mots-clés efficace. L’objectif est de vous fournir une méthode claire, actionnable et durable pour optimiser votre visibilité organique sur Google et les autres moteurs de recherche.

Qu’est-ce qu’un head keyword ?

Un head keyword est un mot-clé court, très générique, composé en général d’un ou deux mots. Il décrit un sujet large, souvent au cœur de votre activité ou de votre thématique principale. Les internautes l’utilisent lorsqu’ils effectuent des recherches peu précises, exploratoires ou très générales.

Par exemple, si vous vendez des baskets en ligne, des head keywords possibles sont :

  • baskets
  • chaussures
  • chaussures sport

Ces requêtes sont très concurrentielles parce qu’elles concentrent un nombre élevé de recherches mensuelles et qu’elles intéressent un grand nombre d’acteurs (marques, marketplaces, blogs spécialisés, médias, etc.). Elles se situent à l’opposé de la longue traîne, composée de requêtes plus longues, plus spécifiques, généralement avec un volume de recherche inférieur mais une intention plus ciblée.

Caractéristiques principales des head keywords

Les head keywords possèdent plusieurs caractéristiques qui les rendent à la fois attractifs et difficiles à travailler :

  • Volume de recherche élevé : ce sont souvent les mots-clés les plus recherchés dans une thématique donnée.
  • Concurrence très forte : de nombreux sites tentent de se positionner dessus (marques, comparateurs, sites médias, pure players e-commerce).
  • Intention de recherche mixte : la requête peut correspondre à une intention informationnelle, commerciale, transactionnelle ou navigationnelle, ce qui complique la création de la page idéale.
  • Taux de conversion parfois plus faible : comme l’intention est plus vague, un clic n’aboutit pas toujours à une action concrète (achat, inscription, prise de contact).
  • Impact fort sur la marque : être visible sur un head keyword renforce considérablement la crédibilité et la notoriété de votre site.

Avantages et limites des head keywords

Avantages

Les bénéfices potentiels des head keywords sont nombreux :

  • Trafic important : un bon positionnement sur un mot-clé court peut générer un volume significatif de visites organiques.
  • Visibilité de marque : apparaître sur des requêtes génériques renforce la légitimité de votre marque dans l’esprit des internautes.
  • Point d’entrée vers votre univers de contenu : une page optimisée sur un head keyword peut servir de porte d’entrée vers des contenus plus précis (guides, fiches produits, études de cas).
  • Effet de halo SEO : en travaillant un head keyword, vous pouvez vous positionner sur de nombreuses variantes et expressions associées.

Limites

Cependant, concentrer sa stratégie uniquement sur ces mots-clés comporte des risques :

  • Difficulté à se positionner : de nombreux domaines, parfois très puissants, occupent déjà les premières places.
  • Temps de résultat plus long : il faut souvent plusieurs mois, voire davantage, pour obtenir une amélioration significative sur ce type de requête.
  • Risque de trafic peu qualifié : une partie des visiteurs ne recherche pas nécessairement ce que vous proposez précisément.
  • Investissement en contenu et en netlinking plus élevé : la concurrence impose une qualité et une profondeur de contenu supérieures à la moyenne.

Head keywords, middle tail et longue traîne

Pour construire une stratégie SEO équilibrée, il est indispensable de ne pas traiter les head keywords de manière isolée, mais de les relier à l’ensemble de votre univers sémantique.

On distingue généralement trois niveaux de mots-clés :

  • Head keywords : 1 à 2 mots, très génériques (ex. « baskets », « chaussures », « SEO », « assurance »).
  • Middle tail : 2 à 3 mots, un peu plus précis (ex. « baskets femme », « chaussures running », « formation SEO »).
  • Longue traîne : requêtes de 3 mots ou plus, très spécifiques (ex. « baskets femme running pronation », « formation SEO en ligne pour débutant »).

Les head keywords servent souvent de piliers autour desquels vous allez structurer des contenus plus précis, ciblant la middle tail et la longue traîne. Cette approche permet de capter à la fois un trafic large et un trafic très qualifié.

Bonnes pratiques pour travailler les head keywords

Pour tirer le meilleur parti des mots-clés courts, il ne suffit pas de les répéter dans vos textes. Il est nécessaire d’adopter une approche structurée et orientée utilisateur.

1. Optimiser le contenu autour de thèmes, pas seulement de mots

Plutôt que de viser uniquement un mot isolé, pensez en termes de thématique. Si votre head keyword est « baskets », votre page principale devra aborder plusieurs sous-thèmes :

  • Les différents types de baskets (running, lifestyle, training, etc.).
  • Les critères de choix (maintien, amorti, matériau, pointure).
  • Les conseils d’entretien.
  • Les tendances actuelles.

Plus votre page est complète, structurée et utile, plus elle a de chances de se positionner sur la requête générique et sur de nombreuses requêtes associées. L’objectif n’est pas de « bourrer » le texte de mots-clés, mais de traiter le sujet de manière exhaustive et claire.

2. Intégrer naturellement les head keywords dans les zones stratégiques

Pour maximiser l’impact SEO de vos head keywords, intégrez-les aux endroits suivants lorsque c’est pertinent :

  • Balise </strong> de la page (avec éventuellement un qualificatif : « Baskets – Guide complet pour bien choisir »).</li> <li><strong>Balise <meta description></strong> (en veillant à rester naturelle et incitative au clic).</li> <li><strong>Balises H1, H2, H3</strong> lorsque cela a du sens pour le lecteur.</li> <li><strong>Introduction</strong> de l’article, pour contextualiser le sujet.</li> <li><strong>Texte d’ancrage</strong> de liens internes pertinents.</li> </ul> <p>Le head keyword doit être présent, mais toujours de manière fluide. Une sur-optimisation (répétition trop fréquente, densité artificielle) peut nuire à l’expérience utilisateur et envoyer un signal négatif aux moteurs de recherche.</p> <h3 id="3-ameliorer-la-structure-du-site-autour-des-mots-cles-piliers">3. Améliorer la structure du site autour des mots-clés piliers</h3> <p>Une <strong>architecture de site claire</strong> renforce la pertinence de vos pages pour les moteurs de recherche. Pour vos head keywords, vous pouvez mettre en place une structure en « pages piliers » et « pages satellites ».</p> <p>Par exemple :</p> <ul> <li>Une page pilier optimisée sur le head keyword « SEO », présentant la discipline, ses enjeux, ses grandes composantes.</li> <li>Des pages satellites sur des sous-thèmes précis : « SEO technique », « recherche de mots-clés », « optimisation on-page », « netlinking », etc.</li> </ul> <p>Les liens internes entre la page pilier et les pages satellites aident Google à comprendre la structure de votre contenu et la page la plus pertinente pour la requête générique.</p> <h3 id="4-creer-un-contenu-de-haute-qualite">4. Créer un contenu de haute qualité</h3> <p>Les moteurs de recherche accordent une importance croissante à la <strong>qualité du contenu</strong> :</p> <ul> <li>Texte clair, bien rédigé, sans fautes.</li> <li>Informations exactes, mises à jour et utiles.</li> <li>Approche orientée utilisateur, répondant réellement aux questions fréquentes.</li> <li>Preuves de crédibilité (expertise, expérience, exemples concrets).</li> </ul> <p>Pour un head keyword, la barre est encore plus haute, car vous êtes en concurrence avec des acteurs souvent très avancés en SEO. Investir du temps dans la recherche, la planification et la rédaction est donc indispensable.</p> <h3 id="5-analyser-la-concurrence-sur-les-head-keywords">5. Analyser la concurrence sur les head keywords</h3> <p>Avant de viser un mot-clé court, il est important de <strong>mesurer le niveau de concurrence</strong>. Les outils spécialisés permettent :</p> <ul> <li>D’identifier les sites déjà positionnés en première page.</li> <li>D’évaluer leur autorité (profil de liens, ancienneté, taille du site).</li> <li>De repérer les types de contenus qui dominent (fiches produits, guides, comparatifs, pages de catégorie).</li> </ul> <p>Cette analyse vous aide à définir une stratégie réaliste : dans certains cas, il sera plus pertinent de viser d’abord la middle tail et la longue traîne pour construire votre autorité, puis de revenir sur le head keyword une fois que votre site sera plus solide.</p> <h3 id="6-combiner-head-keywords-et-longue-traine">6. Combiner head keywords et longue traîne</h3> <p>Une stratégie efficace consiste à utiliser les head keywords comme <strong>axes principaux</strong> de votre site et à développer autour une multitude de contenus ciblant la <strong>longue traîne</strong>. Ces contenus plus spécifiques :</p> <ul> <li>Se positionnent souvent plus facilement.</li> <li>Attirent un trafic très qualifié.</li> <li>Renforcent la thématique centrale associée au head keyword.</li> </ul> <p>Avec le temps, cet ensemble cohérent de pages améliore la perception de votre site comme référence sur le sujet, ce qui peut favoriser votre positionnement sur les requêtes génériques.</p> <h2 id="outils-et-ressources-pour-la-recherche-de-head-keywords">Outils et ressources pour la recherche de head keywords</h2> <p>Pour mener une recherche de mots-clés efficace, l’usage d’outils est indispensable. Ils permettent d’identifier les meilleurs head keywords, d’évaluer le volume de recherche, la difficulté et les opportunités liées à chaque terme.</p> <table> <tr> <th>Outil</th> <th>Fonctionnalités principales</th> </tr> <tr> <td><strong>Google Search Console</strong></td> <td>Analyse des requêtes qui génèrent des impressions et des clics vers votre site, identification des pages positionnées sur certains head keywords, suivi de l’évolution des positions moyennes.</td> </tr> <tr> <td><strong>Google Analytics</strong></td> <td>Mesure du trafic organique, analyse du comportement des utilisateurs (taux de rebond, durée de session, conversions) pour les pages ciblant des mots-clés courts.</td> </tr> <tr> <td><strong>Google Keyword Planner</strong></td> <td>Estimation du volume de recherche mensuel, suggestions de mots-clés associés, indications sur la concurrence publicitaire qui donnent un indice de compétitivité.</td> </tr> <tr> <td><strong>SEMrush</strong></td> <td>Recherche avancée de mots-clés, analyse de la difficulté de positionnement, étude des mots-clés des concurrents, identification des head keywords qui génèrent le plus de trafic dans un secteur.</td> </tr> <tr> <td><strong>Ahrefs</strong></td> <td>Analyse détaillée du profil de liens des sites concurrents, recherche de mots-clés, estimation du trafic organique lié à chaque head keyword, découverte de nouvelles opportunités.</td> </tr> <tr> <td><strong>Ubersuggest</strong></td> <td>Générateur d’idées de mots-clés, données sur le volume de recherche et la difficulté, suggestions de variations et de termes associés.</td> </tr> </table> <p>Ces outils, utilisés conjointement, vous aideront à :</p> <ul> <li>Identifier les head keywords les plus pertinents pour votre activité.</li> <li>Comprendre ce que recherchent réellement vos prospects.</li> <li>Construire un plan de contenu cohérent, allant des requêtes génériques aux requêtes de longue traîne.</li> </ul> <h2 id="methodologie-complete-pour-rechercher-des-head-keywords">Méthodologie complète pour rechercher des head keywords</h2> <p>Pour structurer votre démarche, vous pouvez suivre une méthode en plusieurs étapes.</p> <h3 id="etape-1-nbsp-definir-votre-univers-semantique">Étape 1 : définir votre univers sémantique</h3> <p>Commencez par lister les <strong>thématiques centrales</strong> liées à votre activité :</p> <ul> <li>Vos produits ou services principaux.</li> <li>Les problèmes que vous résolvez.</li> <li>Les grandes catégories de besoins de vos clients.</li> </ul> <p>À partir de ces thématiques, identifiez les mots-clés évidents, très courts, que vos clients potentiels utiliseraient spontanément. Ce sont souvent vos futurs head keywords.</p> <h3 id="etape-2-nbsp-utiliser-les-outils-de-mots-cles">Étape 2 : utiliser les outils de mots-clés</h3> <p>Une fois cette première liste obtenue, saisissez ces termes dans les outils de recherche de mots-clés pour :</p> <ul> <li>Vérifier les volumes de recherche.</li> <li>Découvrir des variantes et des synonymes.</li> <li>Évaluer la difficulté de positionnement.</li> </ul> <p>Conservez uniquement les head keywords qui présentent un bon équilibre entre volume, pertinence pour votre business et faisabilité.</p> <h3 id="etape-3-nbsp-analyser-les-serp-pages-de-resultats">Étape 3 : analyser les SERP (pages de résultats)</h3> <p>Pour chaque head keyword sélectionné, examinez la première page de résultats de Google :</p> <ul> <li>Types de pages présentes (catégories e-commerce, articles de blog, pages institutionnelles, comparateurs).</li> <li>Niveau d’autorité des domaines en place.</li> <li>Format de contenu qui semble privilégié (guides longs, fiches, vidéos, FAQ).</li> </ul> <p>Cela vous donnera des indications précieuses sur le type de contenu que vous devrez produire pour avoir une chance de vous hisser dans le haut du classement.</p> <h3 id="etape-4-nbsp-definir-la-page-cible-pour-chaque-head-keyword">Étape 4 : définir la page cible pour chaque head keyword</h3> <p>Idéalement, un head keyword correspond à une <strong>page principale</strong> de votre site :</p> <ul> <li>Page catégorie pour un site e-commerce.</li> <li>Guide complet ou dossier pour un site éditorial.</li> <li>Page de service pour un site B2B.</li> </ul> <p>Chaque page doit être pensée pour répondre à l’ensemble des intentions possibles liées à la requête : recherche d’information, comparaison, envie d’achat, besoin de conseil, etc.</p> <h3 id="etape-5-nbsp-construire-le-maillage-interne">Étape 5 : construire le maillage interne</h3> <p>Une fois vos pages principales définies, créez des contenus complémentaires (articles, fiches, études de cas) qui approfondissent des aspects précis du sujet. Liez ces contenus entre eux de manière logique :</p> <ul> <li>Des pages satellites vers la page pilier (avec des ancres contenant le head keyword ou ses variantes).</li> <li>De la page pilier vers les contenus plus spécifiques pour guider l’internaute dans sa navigation.</li> </ul> <p>Ce maillage interne renforce la thématique et facilite la compréhension de votre site par les moteurs de recherche.</p> <h3 id="etape-6-nbsp-suivre-les-performances-et-ajuster">Étape 6 : suivre les performances et ajuster</h3> <p>Le travail sur les head keywords est un processus continu. Surveillez régulièrement :</p> <ul> <li>Les impressions et les clics liés aux requêtes principales dans Google Search Console.</li> <li>Le temps passé sur les pages, le taux de rebond et les conversions dans Google Analytics.</li> <li>L’évolution des positions dans les outils de suivi de ranking.</li> </ul> <p>En fonction des résultats, ajustez votre contenu, enrichissez vos pages, améliorez votre maillage interne ou développez de nouveaux contenus de soutien.</p> <h2 id="exemples-concrets-d-utilisation-des-head-keywords">Exemples concrets d’utilisation des head keywords</h2> <p>Pour illustrer ces principes, voici quelques scénarios pratiques.</p> <h3 id="exemple-1-nbsp-site-e-commerce-de-chaussures">Exemple 1 : site e-commerce de chaussures</h3> <p>Head keywords potentiels :</p> <ul> <li>« chaussures »</li> <li>« baskets »</li> <li>« chaussures femme »</li> </ul> <p>Stratégie possible :</p> <ul> <li>Créer une page catégorie principale « Baskets » avec un texte riche, des filtres clairs et des conseils de choix.</li> <li>Développer des sous-catégories « baskets femme », « baskets homme », « baskets enfant ».</li> <li>Rédiger des articles de blog complémentaires : « Comment choisir ses baskets de running », « Tendances baskets 2025 », etc.</li> </ul> <h3 id="exemple-2-nbsp-agence-de-marketing-digital">Exemple 2 : agence de marketing digital</h3> <p>Head keywords possibles :</p> <ul> <li>« SEO »</li> <li>« référencement naturel »</li> <li>« marketing digital »</li> </ul> <p>Stratégie possible :</p> <ul> <li>Créer une page pilier « SEO » présentant les fondements, les bénéfices et les services proposés.</li> <li>Créer des pages spécifiques « SEO technique », « SEO local », « SEO international ».</li> <li>Publier des guides approfondis sur la recherche de mots-clés, l’optimisation on-page, la création de contenu, etc.</li> </ul> <h2 id="erreurs-frequentes-a-eviter-avec-les-head-keywords">Erreurs fréquentes à éviter avec les head keywords</h2> <p>Travailler les mots-clés courts demande rigueur et nuance. Voici quelques erreurs fréquentes à éviter.</p> <ul> <li><strong>Négliger l’intention de recherche</strong> : se focaliser uniquement sur le volume sans se demander ce que l’utilisateur veut réellement obtenir.</li> <li><strong>Surenchérir sur la densité de mots-clés</strong> : répéter le head keyword de manière artificielle au lieu de privilégier un texte naturel et utile.</li> <li><strong>Ignorer la longue traîne</strong> : concentrer tous ses efforts sur quelques termes génériques et délaisser des dizaines de requêtes plus faciles et plus qualifiées.</li> <li><strong>Copier les concurrents sans se différencier</strong> : produire des contenus très similaires à ceux déjà positionnés, sans angle distinctif ni valeur ajoutée.</li> <li><strong>Oublier l’expérience utilisateur</strong> : créer des pages pensées uniquement pour les robots, au détriment de la lisibilité, de la navigation et de la clarté pour le visiteur.</li> </ul> <h2 id="faq">FAQ</h2> <h3 id="qu-est-ce-qu-un-mot-cle-head-keyword-nbsp">Qu’est-ce qu’un mot-clé head keyword ?</h3> <p>Un <strong>mot-clé head keyword</strong> est un terme court, généralement composé d’un à deux mots, qui décrit un sujet principal sur lequel un site web souhaite se positionner. Il s’agit d’une requête générique, à fort volume de recherche et à forte concurrence.</p> <h3 id="pourquoi-utiliser-des-head-keywords-dans-sa-strategie-seo-nbsp">Pourquoi utiliser des head keywords dans sa stratégie SEO ?</h3> <p>Les head keywords permettent d’attirer un trafic important et de renforcer la visibilité de votre marque sur des termes centraux de votre activité. Bien travaillés, ils peuvent servir de piliers à partir desquels vous développez des contenus plus spécifiques, capables de capter un trafic qualifié.</p> <h3 id="comment-choisir-les-bons-head-keywords-nbsp">Comment choisir les bons head keywords ?</h3> <p>Pour choisir les bons mots-clés courts, il est recommandé de :</p> <ul> <li>Partir de vos produits, services et problématiques clients pour identifier les termes les plus représentatifs.</li> <li>Vérifier les volumes de recherche et la concurrence à l’aide d’outils spécialisés.</li> <li>Analyser les résultats de recherche pour comprendre quel type de contenu se positionne déjà.</li> <li>Évaluer la pertinence du mot-clé par rapport à vos objectifs business (notoriété, génération de leads, ventes).</li> </ul> <h3 id="les-head-keywords-suffisent-ils-pour-reussir-en-seo-nbsp">Les head keywords suffisent-ils pour réussir en SEO ?</h3> <p>Non. Une stratégie SEO performante repose sur un équilibre entre head keywords, middle tail et longue traîne. Les mots-clés courts offrent de la visibilité globale, tandis que les requêtes plus longues apportent souvent un trafic mieux qualifié et plus facile à capter au départ.</p> <h3 id="combien-de-head-keywords-faut-il-cibler-nbsp">Combien de head keywords faut-il cibler ?</h3> <p>Le nombre de head keywords dépend de la taille de votre site, de votre secteur et de vos ressources. Il est généralement plus efficace de se concentrer sur quelques termes vraiment stratégiques, de construire des pages piliers solides, puis d’élargir progressivement votre couverture sémantique.</p> <h3 id="peut-on-se-positionner-rapidement-sur-un-head-keyword-nbsp">Peut-on se positionner rapidement sur un head keyword ?</h3> <p>Le positionnement sur un head keyword est souvent un travail de moyen à long terme. Les délais dépendent de la concurrence, de l’autorité de votre domaine, de la qualité de votre contenu et de la cohérence de votre stratégie globale. Miser uniquement sur des résultats immédiats pour ce type de requête est rarement réaliste.</p> <h3 id="faut-il-toujours-viser-la-premiere-place-sur-un-head-keyword-nbsp">Faut-il toujours viser la première place sur un head keyword ?</h3> <p>La première place reste très disputée et parfois difficilement atteignable dans certains secteurs. Se positionner durablement dans les premières positions (par exemple entre la deuxième et la cinquième place), tout en captant un large ensemble de requêtes liées, peut déjà représenter un excellent résultat.</p> <h2 id="conclusion">Conclusion</h2> <p>Les <strong>head keywords</strong> sont un levier puissant pour structurer une stratégie SEO et développer la visibilité d’un site web sur ses thématiques centrales. Leur volume de recherche élevé et leur fort impact en termes de notoriété en font des cibles attractives, mais ils exigent un travail approfondi sur le contenu, la structure du site, le maillage interne et l’analyse de la concurrence.</p> <p>En les intégrant dans une approche globale qui inclut également la middle tail et la longue traîne, vous pouvez bâtir un écosystème de contenus cohérent, capable d’attirer à la fois un grand nombre de visiteurs et un trafic très qualifié. La clé réside dans la compréhension fine des intentions de recherche, l’apport d’une réelle valeur ajoutée au lecteur et l’amélioration continue de vos pages au fil du temps.</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="recherche-de-mots-cles-head-keyword-mot-cle-court-1-2-mots"> <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 = 'recherche-de-mots-cles-head-keyword-mot-cle-court-1-2-mots'; // 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>