Schema Markup WordPress: пошаговое добавление структурированных данных в 2026 году

Что такое Schema Markup и почему он важен для WordPress

Schema.org – это набор типизированных атрибутов, которые помогают поисковым системам понять содержание страницы. При правильной разметке ваш контент (рецепты, товары, отзывы) может появиться в виде rich snippets – улучшенных сниппетов в выдаче, что повышает CTR и позицию в SERP.

В WordPress добавить schema markup проще, чем кажется: от готовых плагинов до чистого кода в functions.php. В этой статье мы разберём оба подхода, покажем готовые примеры и расскажем, как проверить разметку.

Лучшие плагины для автоматической разметки

  • Schema & Structured Data for WP & AMP – поддерживает более 30 типов сущностей, генерирует JSON‑LD и выводит <script type="application/ld+json"> в <head>. Идеален для новостных сайтов и блогов.
  • WP Recipe Maker – специализированный плагин для рецептов. Автоматически добавляет Recipe schema, выводит время готовки, ингредиенты и рейтинг.
  • WooCommerce SEO – если ваш магазин работает на WooCommerce, этот плагин генерирует разметку Product, Offer и Review без дополнительного кода.
  • Schema Pro – визуальный конструктор, позволяющий задавать шаблоны разметки для любой записи через UI.

Все перечисленные плагины совместимы с последними версиями WordPress и проходят проверку на конфликт с другими расширениями.

Ручное добавление JSON‑LD в тему

Если нужен полный контроль или вы хотите минимизировать количество плагинов, можно внедрить разметку вручную. Самый надёжный способ – вывод JSON‑LD через хук wp_head. Ниже пример функции, добавляющей разметку для отдельного поста «Рецепт».

add_action( 'wp_head', 'my_schema_recipe_markup' );
function my_schema_recipe_markup() {
    if ( ! is_single() || get_post_type() !== 'post' ) {
        return;
    }

    $post_id   = get_the_ID();
    $title     = get_the_title( $post_id );
    $excerpt   = get_the_excerpt( $post_id );
    $image_url = get_the_post_thumbnail_url( $post_id, 'full' );
    $prep_time = get_post_meta( $post_id, '_prep_time', true ); // в мин
    $cook_time = get_post_meta( $post_id, '_cook_time', true ); // в мин
    $ingredients = get_post_meta( $post_id, '_ingredients', true ); // массив строк
    $instructions = get_post_meta( $post_id, '_instructions', true ); // массив шагов

    $data = [
        '@context'      => 'https://schema.org/',
        '@type'         => 'Recipe',
        'name'          => $title,
        'description'   => $excerpt,
        'image'         => $image_url,
        'prepTime'      => 'PT' . intval( $prep_time ) . 'M',
        'cookTime'      => 'PT' . intval( $cook_time ) . 'M',
        'recipeIngredient' => $ingredients,
        'recipeInstructions' => array_map( function( $step ) {
            return [ '@type' => 'HowToStep', 'text' => $step ];
        }, $instructions ),
    ];

    echo '' . wp_json_encode( $data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT ) . '';
}

Не забудьте создать метаполя _prep_time, _cook_time, _ingredients и _instructions (можно через Advanced Custom Fields). После добавления кода проверьте вывод в «View source» – должна появиться чистая JSON‑LD‑строка.

Примеры разметки для популярных типов контента

Товары (WooCommerce)

Для продукта достаточно добавить несколько полей в functions.php и вывести их в wp_head. Ниже минимальный набор:

add_action( 'wp_head', 'my_schema_product_markup' );
function my_schema_product_markup() {
    if ( ! is_product() ) return;
    global $product;
    $data = [
        '@context' => 'https://schema.org/',
        '@type'    => 'Product',
        'name'     => $product->get_name(),
        'image'    => wp_get_attachment_url( $product->get_image_id() ),
        'description'=> wp_strip_all_tags( $product->get_description() ),
        'sku'      => $product->get_sku(),
        'offers'   => [
            '@type' => 'Offer',
            'priceCurrency' => get_woocommerce_currency(),
            'price' => $product->get_price(),
            'availability' => $product->is_in_stock() ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock',
            'url' => get_permalink( $product->get_id() ),
        ],
    ];
    echo '' . wp_json_encode( $data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT ) . '';
}

Отзывы (User‑generated)

Если ваш сайт собирает отзывы через форму, добавьте тип Review. Пример кода, который берёт данные из пользовательских полей:

add_action( 'wp_head', 'my_schema_review_markup' );
function my_schema_review_markup() {
    if ( ! is_singular( 'post' ) ) return;
    $rating = get_post_meta( get_the_ID(), '_review_rating', true ); // 1‑5
    $author = get_post_meta( get_the_ID(), '_review_author', true );
    $data = [
        '@context' => 'https://schema.org/',
        '@type'    => 'Review',
        'author'   => [ '@type' => 'Person', 'name' => $author ],
        'reviewRating' => [
            '@type' => 'Rating',
            'ratingValue' => $rating,
            'bestRating' => '5',
            'worstRating'=> '1',
        ],
        'itemReviewed' => [
            '@type' => 'CreativeWork',
            'name' => get_the_title(),
        ],
    ];
    echo '' . wp_json_encode( $data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT ) . '';
}

Тестирование и отладка разметки

После внедрения проверьте результат в Google Rich Results Test. Если разметка не проходит, обратите внимание на:

  1. Корректность JSON (отсутствие лишних запятых, правильные кавычки).
  2. Соответствие типу schema (например, Recipe требует recipeIngredient).
  3. Доступность изображений – URL должен быть абсолютным и публичным.

Для ускорения загрузки JSON‑LD стоит кэшировать результат в transients, а также убедиться, что ваш хостинг не замедляет TTFB. Подробнее о том, как сократить TTFB в WordPress, читайте в статье Как сократить TTFB в WordPress: 7 проверенных методов ускорения сайта.

Важные нюансы и типичные ошибки

  • Дублирование разметки. Не стоит одновременно использовать плагин и ручный код для одного типа сущности – это запутает поисковики.
  • Отсутствие обязательных полей. Google игнорирует разметку, если в ней нет обязательных атрибутов (например, price для Product).
  • Неправильный тип MIME. JSON‑LD должен быть внутри тега <script type="application/ld+json">, а не в обычном <script>.
  • Не обновлённые данные. При изменении контента обновляйте кэш, иначе будет показываться устаревшая разметка.

Если вы используете резервное копирование, убедитесь, что файлы functions.php и активные плагины входят в бэкап. Подробнее о надёжных бэкап‑решениях читайте в статье Бэкап WordPress: лучшие плагины и стратегии резервного копирования в 2026 году.

Где хранить файлы разметки и как управлять ими

Если разметка становится объёмной, удобно вынести её в отдельный файл и подключать через require_once. Пример структуры темы:

// functions.php
require_once get_template_directory() . '/inc/schema-recipe.php';
require_once get_template_directory() . '/inc/schema-product.php';

Такой подход упрощает поддержку и позволяет использовать Файловый менеджер WordPress для быстрой навигации по файлам.

Заключение

Schema markup – мощный SEO‑инструмент, который повышает видимость вашего контента в поиске. В WordPress вы можете реализовать его за считанные минуты с помощью плагинов или полностью контролировать процесс через код. Не забывайте проверять корректность разметки, кэшировать результаты и следить за производительностью сайта (см. CloudPanel + WordPress для оптимального хостинга).

❓ Часто задаваемые вопросы

Можно ли использовать несколько типов schema на одной странице?

Да, JSON‑LD допускает массив объектов. Главное – чтобы каждый объект имел корректный @type и обязательные свойства, иначе разметка будет отклонена.

Как добавить schema markup без изменения темы?

Для этого подойдёт любой из перечисленных плагинов – они генерируют разметку через свои настройки, не требуя правки файлов темы.

Влияет ли schema markup на скорость сайта?

Незначительно. JSON‑LD помещается в и не блокирует рендеринг. При больших объёмах данных стоит кэшировать вывод в transients.

Почему Rich Results Test показывает ошибку «Missing required field»?

Проверьте, что в разметке присутствуют обязательные свойства для выбранного типа (например, price для Product или recipeIngredient для Recipe).