Редактор вставил JSON-LD из генератора: headline длиннее title в браузере, author - строка «Алексей», datePublished без часового пояса. Yoast уже отдавал Article - в исходнике два блока. Rich Results Test молчал, в Яндексе warning на дату. Отключил разметку в плагине, оставил один script с get_the_date(‘c’) и Person - через 10 минут оба валидаторы зеленые. Боль не в «сложной Schema.org», а в полях, которые не совпали с H1 и автором на странице. За вечер на одном посте - один BlogPosting JSON-LD без дубля.
JSON-LD - блок JSON в head: заголовок, автор, даты, обложка. Для поста блога тип BlogPosting (подтип Article). Здесь - один пост, один вечер, два валидатора.
Честный нюанс из документации Google (обновление 2025-12-10, актуально на июль 2026): юридически обязательных свойств нет. Параллельно половина SEO-гайдов пишет «headline обязателен». Практика: без headline, author, dates, image и publisher rich results и дата в сниппете не стабильны - даже если синтаксис JSON валиден.
Выберите BlogPosting для обычного поста, не NewsArticle

Боль: в JSON-LD стоит Article или NewsArticle «на всякий случай», а пост - обычная заметка в блоге, не новостной разрыв. Google поддерживает Article, NewsArticle и BlogPosting; для записи в блоге корректный тип - BlogPosting (наследует поля Article: headline, author, datePublished, dateModified).
На практике NewsArticle нужен для новостного контента с жесткими правилами freshness. Обычный how-to или разбор процесса - BlogPosting. Типичная ошибка: копировать шаблон Organization с главной и вставить его на single post - там другой @type, другая логика.
| Ситуация | @type в JSON-LD | Что не делать |
|---|---|---|
| Обычный пост в блоге | BlogPosting | Не ставить NewsArticle без новостного формата |
| Новостной разрыв, редакционный стандарт | NewsArticle | Не смешивать с BlogPosting на одной URL |
| Главная, лендинг, не пост | WebPage / Organization | Не копировать BlogPosting с поста на главную |
Результат секции: в script один @type BlogPosting, без путаницы с новостной разметкой.
Соберите headline, author и даты из WordPress, не из генератора

Боль: headline в JSON-LD не совпадает с title в вкладке и H1 на странице. Google сравнивает видимый заголовок и разметку; расхождение - warning или игнор поля. Решение: headline = тот же текст, что видит читатель в H1, до ~110 символов (индустрийный лимит для длинных title).
Author как строка «Алексей» - типичная ошибка. Нужен вложенный объект Person: @type, name, url (страница автора или профиль). sameAs с LinkedIn или Habr - плюс для E-E-A-T, если ссылки реальные.
Даты: ISO 8601 с timezone, например 2026-07-30T12:00:00+03:00. В WordPress - get_the_date(‘c’) для datePublished и get_the_modified_date(‘c’) для dateModified. dateModified только если пост реально обновляли и значение >= datePublished.
- Откройте live URL поста: запишите H1, canonical, дату в шапке и имя автора - это эталон.
- View Source: найдите существующие script type=»application/ld+json» (Yoast, Rank Math, тема).
- Соберите минимальный BlogPosting: @context, @type, headline, author (Person), datePublished, mainEntityOfPage (WebPage @id = canonical).
- Добавьте dateModified, image (URL обложки), publisher (Organization + logo), description из meta.
- Вставьте один script в head (wp_head + is_singular(‘post’)) или Custom HTML на статике.
Пример BlogPosting JSON-LD:
{
«@context»: «https://schema.org»,
«@type»: «BlogPosting»,
«headline»: «Как добавить BlogPosting JSON-LD к статье блога: headline, author и даты»,
«description»: «Пошагово: один BlogPosting без дубля, Person-автор, ISO-даты, проверка Google и Яндекса.»,
«mainEntityOfPage»: { «@type»: «WebPage», «@id»: «https://example.com/blogposting-json-ld-dlya-stati-bloga/» },
«author»: { «@type»: «Person», «name»: «Алексей Доронин», «url»: «https://example.com/author/aleksei-doronin/» },
«datePublished»: «2026-07-30T10:00:00+03:00»,
«dateModified»: «2026-07-30T18:30:00+03:00»,
«image»: «https://example.com/wp-content/uploads/2026/07/cover.jpg»,
«publisher»: { «@type»: «Organization», «name»: «Example Blog», «logo»: { «@type»: «ImageObject», «url»: «https://example.com/wp-content/uploads/logo.png» } }
}
В реальном проекте замените example.com на ваш домен. headline копируйте из get_the_title(), не из ChatGPT-шаблона с другим wording.
Оставьте один источник разметки: плагин или тема, не оба

Боль: в head два BlogPosting - Yoast/Rank Math и ручный script или тема. Google видит конфликт, rich results нестабильны. Решение: один источник на single post. Либо SEO-плагин (настройки Schema), либо ваш код в child theme, либо отдельный плагин с фильтром - но не все вместе.
Часто ломается так: разметку в плагине не отключили, «на всякий случай» добавили второй script из гайда. Отключите Article/BlogPosting в Yoast (Search Appearance - Content Types - Posts) или аналог в Rank Math, оставьте один генератор. В GitHub-плагинах (soderlind-json-ld, Ligase-Schema-Markup) смотрите фильтры - один @graph лучше, чем два независимых script.
Тема WordPress может тянуть BlogPosting из inc/json-ld.php, а SEO-плагин дублирует поля. Разметка только на is_singular(‘post’), не на архивах - там второй BlogPosting ломает валидатор.
Схема на вечер:
Открыть пост → View Source → если два BlogPosting → отключить дубль в плагине → один script → Rich Results Test → microtest Яндекса
Результат: один application/ld+json на URL, без конкурирующих headline и author.
Проверьте URL в Rich Results Test и валидаторе Яндекса
Боль: «разметка есть, rich results нет» - часто image URL не crawlable, publisher без logo, или URL закрыт auth wall. Проверка - по публичному URL без логина. Советуем убедиться, что пост открывается без пароля; избегайте теста draft за auth wall.
Google: Rich Results Test - вставьте URL поста, смотрите Article/BlogPosting без критических ошибок. Синтаксис отдельно: validator.schema.org. Rich Results Test проверяет eligibility для Google; schema.org validator - чистый JSON-LD без учета Яндекса. Делайте оба шага: зеленый syntax не гарантирует дату в сниппете, если image 404 или headline расходится с H1.
Яндекс: microtest - URL или фрагмент HTML. Дата без timezone дает warning «некорректное значение даты» - типичная ошибка после копипасты из генератора без +03:00.
- Rich Results Test - BlogPosting распознан, headline/author/dates без critical.
- microtest - BlogPosting виден, даты ISO 8601.
- View Source - ровно один script BlogPosting.
- Сравните headline в JSON и H1 в браузере - символ в символ.
- Опционально Request indexing в Search Console после правок.
Чек-лист: когда разметка готова к индексации
До FAQ - критерии успеха. Пять зеленых пунктов - итог: получите один BlogPosting без дубля, сможете закрыть задачу.
- Один BlogPosting на live URL, без второго блока от плагина.
- headline = видимый H1, не длиннее ~110 символов.
- author - Person с name и url, не строка.
- datePublished и dateModified в ISO 8601 с timezone; dateModified >= datePublished.
- Rich Results Test и microtest без критических ошибок на дату проверки.
Fail-сигналы: дубль BlogPosting, author string, дата без timezone, headline 200+ символов, image 404. Важно: перед индексацией проверьте author url и image - не стоит откладывать. Следующий шаг после BlogPosting - FAQPage или BreadcrumbList, но не в том же вечере: сначала стабильный пост.
Аудит блога - GEO-чеклист для ИИ-поиска; после поста - llms.txt для сайта; процесс микроразметки - calmopsai.com.
Редакционная проверка: Елена Ковалева, главный эксперт по SEO/GEO.
Достоверность: типы Article/BlogPosting, рекомендуемые поля и ISO-даты - Google Search Central и schema.org, accessed 2026-07-30; валидатор Яндекса - ISO 8601 для date. Показы Wordstat по кластеру «микроразметка сайта» в этом прогоне не верифицированы (MCP Wordstat недоступен).
Частые вопросы
Article или BlogPosting - что выбрать для поста WordPress?
Для обычной записи блога - BlogPosting. Article в документации Google - общий класс; BlogPosting точнее описывает формат. NewsArticle только для новостного контента с редакционными правилами freshness.
Нужен ли dateModified при каждой правке?
Нет. dateModified - когда контент реально обновили: текст, обложка, существенные правки. Косметическая правка опечатки - спорный случай; главное - dateModified не раньше datePublished и не фиктивная «сегодня» без изменений.
Как не задвоить schema плагином и ручным кодом?
View Source до правок. Если Yoast или Rank Math уже выводит BlogPosting - отключите schema для posts в настройках плагина или уберите ручной script. Один источник на URL.
Обязателен ли headline, если Google пишет «нет required properties»?
Юридически Google не штрафует пустой headline. Практически без headline, author и dates rich results и дата в сниппете часто не появляются. Делайте recommended набор, не минимальный пустой JSON.
Куда вставлять script на WordPress?
В head через hook wp_head в functions.php child theme при is_singular(‘post’), либо через плагин JSON-LD с фильтром на BlogPosting. Не в body поста - парсеры ожидают JSON-LD в head или допустимо в body, но head - канон для тем.
Чем BlogPosting JSON-LD отличается от «микроразметки всего сайта»?
Гайды про микроразметку сайта закрывают Organization, Product, FAQ целиком. Эта инструкция - только один пост: headline, author, даты, один script, два валидатора. Не подменяет site-wide schema.
