Блог

SEO 7 мин чтения

JSON-LD разметка: готовые примеры и генератор на PHP

JSON-LD - формат структурированных данных, который рекомендует Google. В этом гайде объясняем, что стоит размечать, показываем готовые примеры для самых полезных типов schema.org и паттерн на PHP, которым мы генерируем корректную разметку на каждой странице без ручного JSON.

Обложка статьи: JSON-LD разметка: готовые примеры и генератор на PHP

Коротко

  • JSON-LD - это блок <script type="application/ld+json"> на странице, который описывает её машинам словарём schema.org.
  • Размечайте только то, что пользователь видит на странице. Разметка, не совпадающая с контентом, грозит ручными санкциями и ничего не даёт.
  • Начните с Organization, BreadcrumbList и Article или Product, а FAQPage, Service и LocalBusiness добавляйте там, где они подходят.
  • Генерируйте JSON на PHP из массивов через json_encode, один @graph на страницу, со стабильными значениями @id.
  • Проверяйте шаблоны в Rich Results Test и Schema Markup Validator и следите за отчётами улучшений в Search Console.

JSON-LD разметка сообщает поисковым системам в машиночитаемом виде, чем является страница: статьёй, товаром с ценой, компанией с контактами, списком вопросов и ответов. Посетители её не видят, она не заменяет хороший контент и сама по себе не поднимает позиции. Зато она делает страницу пригодной для расширенных результатов, помогает поисковикам связать ваши страницы с нужной сущностью и даёт ИИ-поиску более чистый источник. Мы генерируем её на каждой странице integrono.com и других своих сайтов, а этот гайд - практическая версия этой работы.

JSON-LD, Microdata и RDFa

Словарь schema.org можно встроить тремя синтаксисами. Microdata и RDFa добавляют атрибуты в HTML-теги, из-за чего разметка переплетается с шаблонами. JSON-LD живёт в одном блоке script отдельно от вёрстки, его проще генерировать, тестировать и менять. Google рекомендует JSON-LD, и мы используем именно его везде.

Принципы до примеров

  • Описывайте видимый контент. Если цены, рейтинга или FAQ нет на странице, их не должно быть и в разметке.
  • Используйте абсолютные URL и канонический адрес страницы.
  • Заполняйте обязательные свойства полностью и добавляйте рекомендуемые, когда у вас есть реальные данные.
  • Связывайте сущности через @id. Автор статьи - организация, описанная один раз с @id, а не новая копия каждый раз.
  • Используйте даты в формате ISO 8601 (2026-10-28 или со временем и часовым поясом).
  • Не выдумывайте отзывы и рейтинги. Фальшивый AggregateRating - частая причина ручных санкций.

Пример 1. Organization (и WebSite)

Разместите на главной странице или в общем для сайта графе. Он описывает сущность, на которую ссылается остальная разметка.

{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://example.com/#organization",
  "name": "Example Studio",
  "url": "https://example.com/",
  "logo": "https://example.com/images/logo.png",
  "email": "[email protected]",
  "sameAs": [
    "https://github.com/example",
    "https://www.linkedin.com/company/example"
  ]
}

Пример 2. BreadcrumbList

Разметка хлебных крошек позволяет Google показывать путь к странице вместо сырого URL в выдаче. Она должна совпадать с видимыми крошками.

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {"@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/"},
    {"@type": "ListItem", "position": 2, "name": "Blog", "item": "https://example.com/blog"},
    {"@type": "ListItem", "position": 3, "name": "JSON-LD guide", "item": "https://example.com/blog/json-ld-guide"}
  ]
}

Пример 3. Article

Для статей блога и гайдов. Важные свойства: заголовок, даты, автор, издатель, изображение и адрес страницы.

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "JSON-LD structured data: examples",
  "description": "Short summary of the article.",
  "url": "https://example.com/blog/json-ld-guide",
  "mainEntityOfPage": "https://example.com/blog/json-ld-guide",
  "inLanguage": "en",
  "datePublished": "2026-08-23",
  "dateModified": "2026-10-28",
  "author": {"@id": "https://example.com/#organization"},
  "publisher": {"@id": "https://example.com/#organization"},
  "image": {"@type": "ImageObject", "url": "https://example.com/images/blog/json-ld.webp", "width": 1200, "height": 630}
}

Меняйте dateModified только когда контент действительно изменился. Обновление даты при каждом деплое - тихий способ потерять доверие.

Пример 4. Product с Offer

Для страниц товаров с видимой ценой. Укажите наличие и валюту, а aggregateRating или review добавляйте, только если реальные отзывы показаны на странице.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Example product",
  "description": "What it is and who it is for.",
  "image": ["https://example.com/images/product.webp"],
  "sku": "EX-001",
  "brand": {"@type": "Brand", "name": "Example"},
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/product/ex-001",
    "priceCurrency": "EUR",
    "price": "49.00",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  }
}

Пример 5. Service с Offer

Для платных услуг, например аудита с фиксированной ценой или почасовой консультации. Такой паттерн мы используем на страницах собственных услуг.

{
  "@context": "https://schema.org",
  "@type": "Service",
  "name": "Architecture review",
  "serviceType": "Software architecture analysis",
  "provider": {"@id": "https://example.com/#organization"},
  "areaServed": "Worldwide",
  "offers": {
    "@type": "Offer",
    "price": "200",
    "priceCurrency": "EUR",
    "url": "https://example.com/services/architecture-review"
  }
}

Пример 6. FAQPage

Разметка FAQ описывает список вопросов и ответов, которые видны на странице. Учтите, что с 2023 года Google показывает FAQ-сниппеты только для ограниченного круга авторитетных сайтов, поэтому не ждите раскрывающихся ответов в выдаче. Разметка остаётся валидной, её читают другие поисковики и ИИ-системы, и она держит FAQ в структуре, которую машины могут цитировать.

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Do I need structured data to rank?",
      "acceptedAnswer": {"@type": "Answer", "text": "No. It is not a ranking requirement, but it can make pages eligible for rich results."}
    }
  ]
}

Объедините всё в одном @graph

На странице редко бывает одна сущность. Поместите все в один script с помощью @graph и ссылайтесь на общие сущности по @id:

{
  "@context": "https://schema.org",
  "@graph": [
    {"@type": "Organization", "@id": "https://example.com/#organization", "name": "Example Studio"},
    {"@type": "Article", "headline": "...", "author": {"@id": "https://example.com/#organization"}},
    {"@type": "BreadcrumbList", "itemListElement": []},
    {"@type": "FAQPage", "mainEntity": []}
  ]
}

Безопасная генерация JSON-LD на PHP

Не собирайте JSON строками вручную. Кавычка в заголовке ломает весь блок, и поисковик молча его игнорирует. Соберите массив PHP и закодируйте его. Важны два набора флагов: читаемый Unicode и защита HTML-контекста через экранирование слэшей и тегов.

function jsonLdScript(array $graph): string
{
    $data = ['@context' => 'https://schema.org', '@graph' => $graph];
    $json = json_encode(
        $data,
        JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP | JSON_THROW_ON_ERROR
    );
    return '<script type="application/ld+json">' . $json . '</script>';
}

$graph = [
    ['@type' => 'Organization', '@id' => $site . '/#organization', 'name' => 'Example Studio', 'url' => $site . '/'],
    [
        '@type'         => 'Article',
        'headline'      => $title,
        'url'           => $canonical,
        'datePublished' => $published,
        'dateModified'  => $modified,
        'author'        => ['@id' => $site . '/#organization'],
    ],
];
echo jsonLdScript($graph);

JSON_HEX_TAG превращает < и > в escape-последовательности, поэтому пользовательский контент не сможет досрочно закрыть тег script. Передавайте в генератор те же данные, из которых строится страница (заголовок, цена, даты), чтобы разметка и видимый контент не расходились. На многоязычном сайте переводите текстовые поля и задавайте inLanguage для каждой локали: именно так сделана разметка статей и FAQ в этом блоге.

Проверка и мониторинг

  1. Rich Results Test - пригодность для типов расширенных результатов Google.
  2. Schema Markup Validator - общий синтаксис schema.org для любого типа.
  3. Отчёты об улучшениях в Search Console (хлебные крошки, товары, FAQ и другие) - ошибки и предупреждения в масштабе сайта после сканирования страниц Google.
  4. Юнит-тест, который рендерит каждый шаблон и проверяет, что JSON-LD парсится и содержит нужные ключи, предотвращает регрессии после рефакторинга.

Ошибки, которые стоят дорого

  • Разметка контента, которого нет на странице (скрытый FAQ, выдуманные рейтинги, цены, отличающиеся от видимых).
  • Несколько конфликтующих блоков от плагина и шаблона с разными Organization.
  • Относительные URL, неверные даты или отсутствие @id.
  • Сломанный JSON из-за ручной сборки строк и неэкранированных кавычек.
  • Разметка как трюк для ранжирования. Это инструмент ясности, а страница всё равно должна заслужить позиции.

Чем мы можем помочь

Структурированные данные - часть нашей работы по техническому SEO: мы проектируем схему для ваших шаблонов, реализуем генератор в вашем стеке и настраиваем проверки, чтобы разметка оставалась корректной после релизов. Если хотите увидеть общую картину проблем сайта, начните с нашего чек-листа технического SEO-аудита или запишитесь на консультацию.

Частые вопросы

Что такое JSON-LD разметка?

Это блок script с данными schema.org в формате JSON, который описывает содержимое страницы для поисковых систем, например статью, товар, организацию или FAQ.

Улучшает ли структурированная разметка позиции?

Напрямую нет. Она помогает поисковикам понять страницу и делает её пригодной для расширенных результатов, что может повысить CTR, но не является требованием ранжирования.

Куда вставлять скрипт JSON-LD?

В любое место HTML, чаще всего в head. Он должен присутствовать в отрисованном HTML, который получает Google, поэтому надёжнее всего генерировать его на сервере.

Стоит ли добавлять разметку FAQPage?

Google показывает FAQ-сниппеты только для ограниченного круга сайтов, но валидную разметку читают другие поисковики и ИИ-системы. Добавляйте её только для вопросов и ответов, которые видны на странице.

Как проверить структурированные данные?

Используйте Rich Results Test от Google для расширенных результатов, Schema Markup Validator для общего синтаксиса и отчёты об улучшениях в Search Console для отслеживания ошибок по всему сайту.

Бесплатный discovery-звонок

Хаотичный стек или зависшая интеграция - Integrono наметит самый умный первый шаг.

Вы получаете senior-взгляд на бюджетные ловушки, зависимости и когда покупать, склеивать или писать - до старта оплаты. CEO остаётся в контуре.