Schema.org в теме WordPress: рабочие приёмы без дублей
Разметка Schema.org в теме WordPress помогает поисковикам понять, где статья, автор и сайт. Показываем, как добавить JSON-LD через хук, не смешать его с разметкой плагина и проверить результат.

Если тема WordPress выводит JSON-LD, а SEO-плагин добавляет свою разметку, одна статья может получить двух авторов, две даты публикации или противоречащие друг другу типы сущностей. В этой практике разберём, как добавить Schema.org для записей через тему, когда это уместно и что проверить перед выкладкой. Примеры рассчитаны на WordPress 6.x и используют стандартные функции ядра.
Сначала выясните, кто уже выводит разметку
Schema.org — словарь типов и свойств для описания сущностей: статьи, сайта, организации, товара. JSON-LD — формат, в котором поисковик получает эти данные. Это не отдельный рейтинг-бустер: разметка описывает содержимое страницы, но сама по себе не гарантирует расширенный результат в поиске.
До правок проверьте главную, запись и страницу рубрики. Откройте исходный код страницы и найдите application/ld+json. Посмотрите, какие типы уже выводят тема, SEO-плагин, плагин отзывов и другие расширения. Дубли особенно легко пропустить, если проверять только настройки темы.
- Есть одна согласованная разметка нужной сущности — не добавляйте вторую только ради «полноты».
- Данные выводит SEO-плагин — управляйте ими через его настройки или API, а не дублируйте в теме.
- Разметки нет или вы сознательно заменяете её собственной — можно добавить JSON-LD через тему.
Тема — не всегда лучшее место для разметки: при смене оформления код исчезнет. Если данные относятся к сайту и должны пережить смену темы, рассмотрите отдельный плагин или собственный плагин проекта. Ни один вариант не отменяет проверку на дубли.
Хорошая разметка не рассказывает поисковику то, чего нет на странице. Она помогает точнее описать уже опубликованный материал.
Три способа добавить JSON-LD
Выбор зависит от того, кому принадлежит разметка и как долго она должна жить. Чем ближе код к конкретной теме, тем проще его связать с шаблоном, но тем дороже смена оформления.
| Подход | Когда выбирать | Цена решения |
|---|---|---|
| SEO-плагин | На сайте уже есть плагин, который управляет SEO и Schema.org | Меньше кода, но возможности и настройки зависят от плагина |
| Функции темы | Разметка относится к шаблону и должна меняться вместе с ним | Нужно следить за обновлениями и не допускать дублей после смены темы |
| Собственный плагин | Разметка должна пережить смену темы или обслуживает правила проекта | Появляется отдельный компонент, который надо тестировать и поддерживать |
Ниже — вариант для активной темы. Вставьте код в functions.php дочерней темы или в подключаемый ею файл. Не редактируйте родительскую тему напрямую: обновление может затереть изменения.
Добавляем BlogPosting для обычных записей
Пример выводит один объект для записей типа post. Он берёт заголовок, URL, даты и автора из WordPress, а не хранит их копии в коде. Для страницы, товара или кастомного типа записей нужны отдельные правила: не объявляйте их BlogPosting автоматически.
<?php
add_action( 'wp_head', 'mytheme_output_post_schema' );
function mytheme_output_post_schema() {
if ( ! is_singular( 'post' ) ) {
return;
}
$post_id = get_queried_object_id();
if ( ! $post_id ) {
return;
}
$author_id = (int) get_post_field( 'post_author', $post_id );
$schema = array(
'@context' => 'https://schema.org',
'@type' => 'BlogPosting',
'mainEntityOfPage' => get_permalink( $post_id ),
'headline' => get_the_title( $post_id ),
'datePublished' => get_the_date( DATE_W3C, $post_id ),
'dateModified' => get_the_modified_date( DATE_W3C, $post_id ),
'author' => array(
'@type' => 'Person',
'name' => get_the_author_meta( 'display_name', $author_id ),
),
);
echo "\n<script type=\"application/ld+json\">";
echo wp_json_encode(
$schema,
JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT
);
echo "</script>\n";
}
Проверьте, что функция не объявлена в другом подключаемом файле под тем же именем. Если имена функций в теме уже имеют собственный префикс, используйте его вместо mytheme_. Код не добавляет логотип издателя и изображения: эти свойства имеет смысл включать только при наличии подходящих, актуальных данных.
Почему здесь используется JSON-кодирование
Не собирайте JSON конкатенацией строк и не вставляйте заголовок записи в скрипт вручную. wp_json_encode() кодирует значения из PHP-массива, а флаги JSON_HEX_* помогают безопасно представить специальные символы в HTML-контексте. Если в исходном коде получился некорректный JSON, сначала проверьте, что функция кодирования вернула результат и данные записи доступны.
Когда что выбирать
- Плагин уже выводит Article или BlogPosting. Оставьте один источник данных. Если он заполняет поля неправильно, ищите настройку или документированный фильтр именно этого плагина.
- Разметка зависит от устройства темы. Например, тема задаёт шаблон карточки записи. Тогда код в дочерней теме проще поддерживать рядом с этим шаблоном.
- Разметка — постоянное правило проекта. Перенесите её в собственный плагин, чтобы смена темы не изменила данные в поиске.
Не выводите одну и ту же сущность сразу всеми тремя способами. Если проверка показывает дубли, сначала отключите лишний источник, а не пытайтесь «исправить» конфликт дополнительными полями.
Что ломается на практике
Дубли после включения кода
Наиболее частая причина — SEO-плагин уже добавляет Article или BlogPosting. Сравните исходный код до и после изменения, найдите все блоки JSON-LD и определите владельца каждого. Оставьте один согласованный набор данных для статьи. Удаление блока из темы не поможет, если второй источник находится в плагине.
На странице не тот тип сущности
Проверка только через условие «это отдельная страница» может захватить страницы, которые не являются статьями: например, товар или профиль. В примере условие ограничено обычными записями WordPress. Для кастомного типа добавляйте отдельную проверку и описывайте сущность только в соответствии с содержимым страницы.
Автор или дата расходятся с видимой страницей
Проверьте, что тема показывает те же имя автора и даты, которые попали в JSON-LD. Если на странице изменили автора или дату, а разметка берёт значение из другого источника, поисковик увидит несогласованные данные. Дата изменения также не должна обновляться просто от открытия записи.
Проверка проходит, но расширенного результата нет
Валидный JSON означает только то, что данные удалось прочитать. Он не подтверждает право страницы на расширенный результат и не обещает его показ. Убедитесь, что тип подходит содержимому, свойства заполнены достоверно, а сам материал доступен поисковику. Ошибки, предупреждения и статус индексации проверяйте в инструментах поисковой системы.
Проверка перед публикацией
- Откройте отдельную запись и найдите в исходном коде блок
application/ld+json. Проверьте, что блок один для описываемой статьи и JSON разбирается без ошибки. - Сверьте заголовок, URL, автора и даты с тем, что видит посетитель на странице. Проверьте также запись без изображения и запись с нестандартными символами в заголовке.
- Запустите страницу через валидатор Schema.org и инструмент проверки результатов расширенного поиска. Они отвечают на разные вопросы: корректна ли разметка и подходит ли она для конкретного поискового представления.
- После обновления темы и SEO-плагина повторите проверку. Просмотрите также страницу рубрики и обычную страницу, чтобы условие вывода не задело неподходящие типы.
Где подход ломается: пример рассчитан на записи WordPress и не моделирует каталог товаров, локальный бизнес, рецепты или цепочку связанных сущностей. Для таких случаев сначала определите нужный тип и обязательные свойства по документации, а затем проверьте, что каждое значение подтверждается содержимым страницы.
Что делать дальше
Начните с инвентаризации: сохраните исходный код одной записи и посчитайте блоки JSON-LD до изменений. После внедрения сравните их количество и значения, а затем проверьте несколько разных записей. В продакшене следите не только за ошибками валидатора, но и за тем, чтобы разметка оставалась синхронной с видимым автором, датами и содержанием страницы.
Термин: JSON-LD — способ передать структурированные данные отдельным JSON-блоком в HTML-странице. Его не нужно смешивать с видимым текстом статьи, но данные в блоке должны соответствовать этому тексту.
Разбор научной статьи: Сложный текст — понятным языком, с терминами
Спросить за 12 ₽Источники: WordPress Developer Resources: wp_head, Schema.org: Article
Частые вопросы
Нужно ли добавлять Schema.org вручную, если установлен SEO-плагин?
Куда лучше добавить код — в functions.php или в плагин?
Можно ли использовать BlogPosting для страниц и товаров?
Почему валидатор не находит ошибку, а Google не показывает расширенный результат?
Что проверить после обновления темы или плагина?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.