JSON-LD Schema.org - одновременно наиболее недоиспользуемая SEO-техника (большинство сайтов не имеют структурированных данных или имеют сломанные) и самое высокорычажное одиночное изменение (правильно реализованная схема Product с AggregateRating даёт звёздные рейтинги в SERP без дополнительной контентной работы). В этой статье разбираю три вещи: модель entity graph Schema.org - как @id-линковка соединяет разрозненные JSON-LD блоки в представление знаний, которое реально используют Google и LLM-системы; архитектуру инъекции в Next.js App Router - что умеет generateMetadata(), а что нет, почему Server Component <script> - правильный паттерн, и XSS-вектор в dangerouslySetInnerHTML, который большинство оставляет открытым; и картину eligibility Google rich results в 2026 - что работает, что устарело (HowTo, сент. 2023), что ограничено (FAQPage, авг. 2023), и зачем сохранять 'невознаграждённые' структурированные данные для AI/LLM-цитирования.
Часть I - Модель entity graph: Schema.org - не тегологарный словарь
Концептуальная ошибка, продуцирующая низкоценные реализации, - трактовать Schema.org как набор меток @type для декорирования контента. Schema.org - это *общий словарь для описания сущностей и их связей*, предназначенный для машин, строящих представления знаний. Три базовых категории: Things (любая сущность: Person, Product, Article), Actions (верифицируемые события: SearchAction, ReviewAction) и DataTypes (text, number, date, URL).
- @id линковка: Каждая сущность, на которую ссылаются другие, должна иметь
@id- глобально уникальный URI.BlogPostingс"author": { "@type": "Person", "@id": "https://samcheek.com/about#person" }ссылается на известную идентифицированную сущность, описанную на странице About. Когда Google видит одинаковый@idURI на нескольких страницах, он накапливает доказательства об этой сущности - так личные бренды получают Knowledge Panel записи. - @graph паттерн: Несколько связанных сущностей страницы объединяются в один JSON-LD блок под
"@graph": [...]. Чище, чем несколько<script>тегов, и делает связи между сущностями явными. - sameAs: Связывает сущность с её представлениями на авторитетных источниках (LinkedIn, GitHub, Twitter, Wikidata). Каждый
sameAsURL - сигнал подтверждения сущности. Google использует его для построения уверенности в Knowledge Graph-представлении. - @context обязателен: Каждый JSON-LD блок должен включать
"@context": "https://schema.org". Без него типы и свойства - произвольные строки без семантики. JSON-LD блок без@contextпроизводит нулевую ценность структурированных данных.
Часть II - JSON-LD vs Microdata vs RDFa
- Microdata: HTML-атрибуты
itemscope,itemtype,itempropнепосредственно в разметке. Проблемы: тесная связь данных с DOM - любой рефактор разметки молча ломает схему; не может описать данные, которые не отображаются на странице. - RDFa: XML-пространства имён в HTML. Те же проблемы связанности, что и у Microdata.
- JSON-LD: Структурированные данные в блоке
<script type="application/ld+json">, полностью отделены от HTML. Преимущества: презентационно-независим; безопасен к рефакторингу; легко генерируется программно; рекомендуемый формат Google.<script type="application/ld+json">не выполняется браузером как JavaScript - MIME-тип сигнализирует, что это данные.
Часть III - Архитектура инъекции в Next.js App Router
- `generateMetadata()` НЕ поддерживает JSON-LD: API
Metadataуправляет<title>,<meta>,<link rel>- но не произвольными<script>тегами. ПоляstructuredDataилиjsonLdне существует в типе Next.jsMetadata. - Server Component `<script>` инъекция (правильный паттерн):
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />. Рендерится в начальный серверный HTML; никакого клиентского JavaScript. - Компонент `<StructuredData>`: Тонкая обёртка, принимающая
dataпропс и рендерящая<script>тег. Единственный канонический паттерн инъекции структурированных данных по всем страницам. - XSS через dangerouslySetInnerHTML:
JSON.stringify(data)может содержать</script>, если поле данных содержит эту подстроку. Исправление:JSON.stringify(data).replace(/</g, '\\u003c'). Unicode-экранирование валидно для JSON, браузер никогда не увидит буквальный</script>внутри блока<script>. - Стратегия размещения: Site-level сущности (
WebSite,Person/Organization) - вapp/layout.tsx. Page-level сущности (Article,Product,BreadcrumbList) - вpage.tsxкаждого маршрута.
Часть IV - Site-level схема: WebSite, Person, Organization
- WebSite + SearchAction (Sitelinks Searchbox):
{ "@type": "WebSite", "@id": "https://example.com#website", "url": "https://example.com", "potentialAction": { "@type": "SearchAction", "target": { "@type": "EntryPoint", "urlTemplate": "https://example.com/search?q={search_term_string}" }, "query-input": "required name=search_term_string" } }. Триггерит поисковый виджет Sitelinks в брендированных SERP. - Person (личный бренд): Ключевые свойства:
name,url,image(Google использует для Knowledge Panel),jobTitle,sameAs(массив URL соцпрофилей),address(PostalAddress),knowsAbout(массив тематических строк - помогает AI-системам определить экспертизу). URI@id- персистентный идентификатор сущности, используемый всеми article и review схемами. - ProfessionalService: Субкласс
LocalBusiness. ДобавляетserviceType,hasOfferCatalog. Требуется для Google local service rich results:name,address,telephone. Для remote-only бизнеса -areaServed: 'Worldwide'.
Часть V - Content Schema: Article, BlogPosting
- Иерархия типов:
BlogPosting→Article→CreativeWork→Thing. ИспользуйтеBlogPostingдля блог-статей;NewsArticleтолько для журналистики от признанных новостных издателей. - Обязательные поля для Google rich results:
headline(≤ 110 символов),image(min 1200×630px),datePublished(ISO 8601:"2026-03-18"- не строка типа"18 марта 2026"),author(Person сnameи@idдля E-E-A-T). Отсутствие любого из них подавляет eligibility rich result. - author @id entity linking (цепочка E-E-A-T):
"author": { "@type": "Person", "@id": "https://samcheek.com/about#person", "name": "Yevhen Samkov" }. Google следует@id-ссылке на Person-сущность сknowsAboutиsameAsпри оценке E-E-A-T статьи. - dateModified: Включать всегда. Обновлять при любых содержательных правках - не только при исправлении опечаток. Машиночитаемый сигнал свежести контента.
Часть VI - Product, Offer, AggregateRating
- Обязательные поля для Product rich results:
name,image,offers.price(строка:"29.99"),offers.priceCurrency(ISO 4217:"USD"),offers.availability("https://schema.org/InStock"). Полная архитектура Product-схемы для headless Shopify - в гайде по headless Shopify. - AggregateRating (звёздные рейтинги в SERP):
ratingValue,bestRating,worstRating,ratingCount- обязательны. БезratingCountGoogle не отображает звёзды. - Merchant listings (Google Shopping бесплатно): Продукты с валидным
Product+Offereligible для бесплатных merchant listings в Shopping-вкладке. Обязательно:Offer.sellerидентифицирует продавца.
Часть VII - FAQPage после ограничения августа 2023
- Ограничение 2023: Google убрал FAQPage accordion rich results для коммерческих сайтов в августе 2023. Остаётся только для государственных и медицинских сайтов. Техническая реализация FAQPage не устарела - только визуальное SERP-улучшение убрано.
- Ценность для AI/LLM-цитирования (GEO): Структура
Question+acceptedAnswer.textобеспечивает AI-системам (Google AI Overviews, Perplexity, ChatGPT) данные с высокой точностью извлечения для цитирования в AI-генерируемых сводках.acceptedAnswer.textдолжен быть полным самодостаточным ответом - AI-системы не переходят по ссылкам при построении цитат. - Рекомендация: Существующую FAQPage схему сохранять - LLM-цитирование + Bing rich results. Не добавлять новую исключительно ради Google rich results. FAQ-секции проектировать с полными
acceptedAnswer.textдля AI-извлечения.
Часть VIII - BreadcrumbList, устаревшие типы и частые ошибки
- BreadcrumbList: Изменяет отображение URL в SERP с технического пути на читаемую хлебную крошку. Требует полного соответствия визуальной навигации на странице - расхождение может вызвать ручное действие Google.
- HowTo - устарел сентябрь 2023: Google убрал HowTo rich results. Всю HowTo-схему на коммерческих сайтах следует удалить - производит нулевую ценность и вызывает предупреждения в Rich Results Test.
- Частые ошибки:
- Отсутствие
@context- JSON-LD блок без семантики. - Регистр
@type: PascalCase (Product,BlogPosting) - неproduct,blog-posting. datePublishedформат: только ISO 8601 ("2026-03-18").price- строка, не число:"29.99", не29.99.- Относительные URL в
url/item/@id- только абсолютные URL. - XSS через
dangerouslySetInnerHTML:JSON.stringify(data).replace(/</g, '\\u003c').
Заключение
Структурированные данные, реализованные как entity graph с @id-линковкой, sameAs-перекрёстными ссылками и полными обязательными полями, производят накопительную ценность, которую тег-чеклист не даёт. Немедленная ценность - SERP-улучшения; долгосрочная - Knowledge Graph-представление сущности, делающее сайт цитируемым источником в AI Overviews и LLM-поиске. Для аудита структурированных данных или полного technical SEO - сервис technical SEO & schema | кейсы | обсудить проект.
Источники
- Schema.org. 'Full Hierarchy': https://schema.org/docs/full.html
- Google. 'Introduction to Structured Data': https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data
- Google. 'Rich Results Types': https://developers.google.com/search/docs/appearance/structured-data/search-gallery
- Google. 'FAQPage update (August 2023)': https://developers.google.com/search/blog/2023/08/howto-faq-changes
- W3C. 'JSON-LD 1.1 Specification': https://www.w3.org/TR/json-ld11/
- Google. 'Rich Results Test': https://search.google.com/test/rich-results
- Schema.org Validator: https://validator.schema.org
