Automatisation SEO Sémantique
Génère des schémas JSON-LD (Schema.org) et des balises Meta dynamiques par analyse de contenu - l'IA lit ton article et forge les runes d'indexation.
7.1Les runes d'indexation
Google utilise les données structurées pour afficher des rich snippets dans les résultats : étoiles de notation, breadcrumb, aperçu d'article, FAQ déroulante… Chaque format de rich snippet correspond à un schéma Schema.org différent.
Schémas les plus utiles
- •
Article- articles de blog - •
BreadcrumbList- fil d'Ariane - •
FAQPage- questions/réponses - •
Course- cours en ligne - •
Person- page auteur - •
WebSite- moteur de recherche interne
Bénéfices concrets
- • +20-30% de CTR sur les rich snippets
- • Meilleure compréhension du contenu par Google
- • Éligibilité aux fonctionnalités SERP avancées
- • Boost pour les requêtes vocales et IA
7.2Générer le JSON-LD pour un article
Tu es un expert en SEO et données structurées Schema.org.
Génère une fonction TypeScript "generateArticleJsonLd(post: WpPost)" qui retourne un objet JSON-LD pour le type Article de Schema.org.
Inclure :
- @context, @type : Article
- headline (titre décodé HTML)
- description (extrait nettoyé du HTML)
- author (name, url vers /auteurs/[slug])
- datePublished, dateModified (ISO 8601)
- image (URL image à la une)
- url (URL canonique)
- publisher (nom du site, logo depuis les constantes de site)
Base URL : process.env.NEXT_PUBLIC_SITE_URL
La fonction doit retourner null si les données requises sont manquantes.import type { WpPost } from '@/lib/types/schemas/post.schema';
const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? '';
const SITE_NAME = 'BaliseTonSite';
const LOGO_URL = `${SITE_URL}/logo.png`;
function stripHtml(html: string): string {
return html.replace(/<[^>]*>/g, '').trim();
}
export function generateArticleJsonLd(post: WpPost): Record<string, unknown> | null {
const author = post._embedded?.author?.[0];
const image = post._embedded?.['wp:featuredmedia']?.[0]?.source_url;
if (!author) return null;
return {
'@context': 'https://schema.org',
'@type': 'Article',
headline: stripHtml(post.title.rendered),
description: stripHtml(post.excerpt.rendered).slice(0, 160),
author: {
'@type': 'Person',
name: author.name,
url: `${SITE_URL}/auteurs/${author.slug ?? ''}`,
},
datePublished: post.date,
dateModified: post.modified ?? post.date,
image: image ? { '@type': 'ImageObject', url: image } : undefined,
url: `${SITE_URL}/${post.slug}`,
publisher: {
'@type': 'Organization',
name: SITE_NAME,
logo: { '@type': 'ImageObject', url: LOGO_URL },
},
mainEntityOfPage: { '@type': 'WebPage', '@id': `${SITE_URL}/${post.slug}` },
};
}7.3Injecter le JSON-LD dans Next.js
import { generateArticleJsonLd } from '@/lib/seo/article-jsonld';
export default async function ArticlePage({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const post = await fetchPost(slug);
const jsonLd = generateArticleJsonLd(post);
return (
<>
{jsonLd && (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
)}
<article>{/* contenu */}</article>
</>
);
}7.4generateMetadata dynamique depuis le contenu
export async function generateMetadata({ params }: Props): Promise<Metadata> {
const { slug } = await params;
const post = await fetchPost(slug);
const title = stripHtml(post.title.rendered);
const description = stripHtml(post.excerpt.rendered).slice(0, 155);
const image = post._embedded?.['wp:featuredmedia']?.[0]?.source_url;
return {
title: `${title} - BaliseTonSite`,
description,
openGraph: {
title,
description,
type: 'article',
publishedTime: post.date,
authors: [post._embedded?.author?.[0]?.name ?? ''],
images: image ? [{ url: image, width: 1200, height: 630 }] : [],
},
twitter: {
card: 'summary_large_image',
title,
description,
images: image ? [image] : [],
},
alternates: {
canonical: `${process.env.NEXT_PUBLIC_SITE_URL}/${slug}`,
},
};
}Le prompt "génère tous mes schémas"
Demande à l'IA de générer une batterie complète : JSON-LD Article, BreadcrumbList, WebSite, Person - en une seule demande, en lui donnant la liste de tes pages et leur type de contenu.