Структурированные данные — это звёзды рейтинга, FAQ-раскрывашки, хлебные крошки и карточки статей в выдаче. А ещё это формат, который AI-движки парсят надёжнее всего. В App Router рендерите JSON-LD как script-тег из серверного компонента (с типами из schema-dts):
import type { WithContext, BlogPosting } from "schema-dts";
export default async function PostPage({ params }) {
const post = await getPost(params.slug);
const jsonLd: WithContext<BlogPosting> = {
"@context": "https://schema.org",
"@type": "BlogPosting",
headline: post.title,
description: post.excerpt,
datePublished: post.publishedAt,
dateModified: post.updatedAt,
author: {
"@type": "Person",
name: "Vlad Sedenko",
url: "https://example.com/about",
},
image: post.ogImage,
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
<article>{/* ... */}</article>
</>
);
}
Какие типы внедрять — по убыванию эффекта:
Organization/Person— на весь сайт, в корневом layout. Питает панель знаний.BlogPosting/Article— каждый пост.BreadcrumbList— заменяет URL в выдаче на читаемый путь.FAQPage— для страниц с настоящими вопросами-ответами (их же активно цитируют AI-движки).Product+Offer+AggregateRating— e-commerce; отсюда берутся звёзды.Service+LocalBusiness— агентства и локальный бизнес.
Валидируйте через Rich Results Test от Google — валидатор schema.org проверяет синтаксис, но только инструмент Google скажет, подходите ли вы под rich results.
Чеклист:
- JSON-LD рендерится на сервере (не инжектится на клиенте после загрузки)
- Article/BlogPosting на всех постах с настоящими датами
- BreadcrumbList по всему сайту
- Данные в разметке совпадают с видимой страницей (за расхождение можно получить ручные санкции)