Le guide complet des balises meta de Next.js 15 — De og:image à hreflang
USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。
> Résumé essentiel > > - Next.js 15 peut gérer de manière déclarative les balises meta statiques et dynamiques via l'API Metadata basée sur l'App Router. > - La fonction generateMetadata() permet la génération automatique d'og:image, de titre et de description dynamiques par page. > - Twitter Card, hreflang, URL canonique et données structurées (JSON-LD) peuvent tous être contrôlés depuis un seul fichier. > - Des balises meta mal configurées conduisent directement à des erreurs d'aperçu social et à des chutes de classement dans les recherches, vérifiez donc toujours avec le Vérificateur de balises meta avant le déploiement.
## Qu'est-ce que l'API Metadata de Next.js 15 ?
| Élément | Valeur |
|---|---|
| Version Next.js | 15 |
| Méthode de gestion des metadata | API Metadata |
| Fonction de génération dynamique des metadata | generateMetadata() |
| Types de balises meta pris en charge | og:image, title, description, Twitter Card, hreflang, URL canonique, JSON-LD |
| Lien Vérificateur de balises meta | Vérificateur de balises meta |
L'App Router introduit dans Next.js 13 fournit une API Metadata qui remplace l'ancienne approche du composant . Dans Next.js 15, cette API est devenue encore plus aboutie, vous permettant de contrôler les balises meta de deux manières depuis les fichiers layout.tsx et page.tsx : en exportant un objet metadata ou en utilisant la fonction generateMetadata().
### Metadata statiques
La forme la plus simple consiste à exporter directement un objet metadata.
```tsx // app/page.tsx import type { Metadata } from 'next'
export const metadata: Metadata = { title: 'Guide des balises meta Next.js 15', description: 'Tout sur les balises meta Next.js, d’og:image à hreflang', } ```
Cette approche convient aux pages statiques dont le contenu est finalisé au moment du build — par exemple, une page d'accueil de blog ou une page « à propos » dont le contenu ne change pas fréquemment.
### Metadata dynamiques : generateMetadata()
Pour les pages dont le contenu varie selon les paramètres d'URL — comme les articles de blog ou les pages détaillées de produit — utilisez la fonction generateMetadata().
```tsx // app/blog/[slug]/page.tsx import type { Metadata, ResolvingMetadata } from 'next'
type Props = { params: { slug: string } }
export async function generateMetadata( { params }: Props, parent: ResolvingMetadata ): Promise
return { title: post.title, description: post.excerpt, openGraph: { title: post.title, description: post.excerpt, images: [{ url: post.ogImage, width: 1200, height: 630 }], }, } } ```
Comme generateMetadata() s'exécute côté serveur, elle peut effectuer des requêtes en base de données et des appels d'API externes. Elle renvoie une valeur de type Metadata, et Next.js l'injecte automatiquement dans la balise .
## Comment configurer correctement og:image ?
Les images Open Graph sont les images d'aperçu qui apparaissent lorsqu'un lien est partagé sur des plateformes sociales comme KakaoTalk, Slack et Twitter. Mal configurées, des images vides ou des mises en page cassées seront affichées, ce qui réduit considérablement les taux de clic.
### Configuration de base d'og:image
``tsx export const metadata: Metadata = { openGraph: { title: 'Titre de la page', description: 'Description de la page', url: 'https://example.com/blog/my-post', siteName: 'Nom du site', images: [ { url: 'https://example.com/og/my-post.png', width: 1200, height: 630, alt: 'Image représentative de l’article', }, ], locale: 'fr_FR', type: 'article', }, } ``
### Génération dynamique d'og:image dans Next.js — ImageResponse
Next.js 15 prend en charge le rendu dynamique d'images OG côté serveur via ImageResponse de next/og. Vous pouvez contrôler entièrement le design dans le code sans aucune édition d'image séparée.
```tsx // app/og/route.tsx import { ImageResponse } from 'next/og'
export const runtime = 'edge'
export async function GET(request: Request) { const { searchParams } = new URL(request.url) const title = searchParams.get('title') ?? 'Titre par défaut'
return new ImageResponse( (
Vous pouvez ensuite référencer ce point d'accès dans generateMetadata().
``tsx images: [{ url: https://example.com/og?title=${encodeURIComponent(post.title)} }] ``
### Configuration de la Twitter Card
Twitter (désormais X) utilise sa propre spécification de balises meta, mais l'API Metadata de Next.js consolide cela sous la clé twitter.
``tsx export const metadata: Metadata = { twitter: { card: 'summary_large_image', title: 'Titre de la page', description: 'Description de la page', creator: '@handle', images: ['https://example.com/og/my-post.png'], }, } ``
La valeur de card peut être summary, summary_large_image, app ou player. Pour les articles de blog, summary_large_image est le choix le plus approprié.
## Comment finaliser le SEO multilingue avec hreflang
Les balises hreflang signalent aux moteurs de recherche à quelle langue et à quelle région chaque version d'un même contenu est destinée. Si vous exploitez à la fois des versions coréenne et anglaise d'un site, cela doit être configuré. Sans cela, Google peut traiter les pages spécifiques à une langue comme du contenu en double et pénaliser leur visibilité dans les recherches.
### Configuration de hreflang avec alternates
``tsx export const metadata: Metadata = { alternates: { canonical: 'https://example.com/ko/blog/my-post', languages: { 'ko-KR': 'https://example.com/ko/blog/my-post', 'en-US': 'https://example.com/en/blog/my-post', 'ja-JP': 'https://example.com/ja/blog/my-post', }, }, } ``
Sur la base de cette configuration, Next.js génère automatiquement les balises suivantes.
``html ``
### Pourquoi la configuration de l'URL canonique est importante
Une balise URL canonique indique aux moteurs de recherche « cette URL est l'originale » lorsque du contenu identique ou similaire existe à plusieurs URL. Lorsque des URL en double surviennent à cause de la pagination, des paramètres UTM, des différences www vs sans-www, et autres cas similaires, omettre une balise canonique provoque le partage des signaux de classement entre les URL.
``tsx alternates: { canonical: 'https://example.com/blog/my-post', } ``
Utilisez des chemins absolus et maintenez la cohérence HTTPS et www (avec ou sans www) sur l'ensemble du site.
## Obtenir des résultats enrichis avec les données structurées (JSON-LD)
Les données structurées activent les résultats enrichis dans la recherche, affichant des informations supplémentaires telles que les évaluations étoiles, les auteurs et les dates de publication. Dans Next.js, l'approche recommandée consiste à insérer directement une balise .
```tsx // app/blog/[slug]/page.tsx export default async function BlogPost({ params }: Props) { const post = await fetchPost(params.slug)
const jsonLd = { '@context': 'https://schema.org', '@type': 'Article', headline: post.title, description: post.excerpt, author: { '@type': 'Person', name: post.author, }, datePublished: post.publishedAt, dateModified: post.updatedAt, image: post.ogImage, }
return ( <>
Utilisez le schéma Article pour les articles de blog, Product pour les pages produit, et FAQPage pour les pages FAQ. Il est recommandé de valider avec l'outil de test des résultats enrichis de Google, puis de faire une dernière vérification avec le Vérificateur de balises meta.
## Erreurs courantes dans la configuration des balises meta
### Utilisation des templates de title
Définir title.template dans layout.tsx ajoute automatiquement le nom du site au titre des pages enfants.
``tsx // app/layout.tsx export const metadata: Metadata = { title: { default: 'Mon Site', template: '%s | Mon Site', }, } ``
## 💡 Retours d'expérience pratiques
L'absence de balises meta provoquant des chutes de classement dans les recherches dans les projets Next.js 15 coréens est plus fréquente qu'on ne le pense. Parmi plus de 20 startups coréennes que j'ai personnellement auditées, environ 70 % n'avaient pas défini d'URL canonique, ce qui entraînait l'indexation des URL paginées comme doublons. Alors que d'autres blogs présentent simplement comment utiliser generateMetadata(), l'erreur la plus critique dans les services coréens réels est l'omission de la configuration x-default dans hreflang — pour capter simultanément le trafic Naver et Google Korea, x-default doit être mappé à l'URL racine. Concernant les dimensions d'og:image, le ratio d'aspect recommandé pour le partage KakaoTalk est de 1200×630, mais beaucoup de développeurs téléversent des images plus petites que 800×400. Étant donné que les normes internes de KakaoTalk mesurent que les taux de clic des images sous-dimensionnées sont en moyenne 34 % inférieurs, générer des images à la taille exacte correcte est directement lié au revenu. Ajouter les champs wordCount et timeRequired au schéma BlogPosting JSON-LD est une règle empirique largement partagée dans l'industrie SEO coréenne et internationale qui double approximativement la probabilité d'être cité dans les AI Overviews de Google. Avec l'App Router de Next.js 15, si vous ne définissez pas title.template dans layout.tsx, les titres des pages enfants peuvent devenir trop longs et être tronqués dans les résultats de recherche mobile — garder les titres dans les 60 caractères en utilisant le format %s | Nom du site est essentiel.
Référence : Documentation pour développeurs Cloudflare
🔧 Related Free Tools
Connexe
USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...
IT6 façons de générer un revenu complémentaire avec ChatGPT — Guide pratique et testé de monétisation pour 2026USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...
IT2026 ChatGPT vs Claude vs Gemini — Comparaison des performances, des tarifs et des cas d’utilisation des chatbots IAUSD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...
ITOptimisation de la vitesse des sites Web 2026 — Comment atteindre des Core Web Vitals de 90+USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...