Как сделать свою Schema для сайта на WordPress?

Зачастую Schema уже есть в стандартном функционале любого SEO плагина, который дополнительно устанавливается на сайт. Небольшие настройки, и все готово. Но есть нюанс! Во-первых, на бесплатной версии плагина, возможность редактирования схемы нет, а во-вторых, там используются самые стандартные (распространенные) типы схем Organization, Article, Product и тп.

В таком случае есть смысл сделать свою Schemu, которая будет содержать всю ту необходимую информацию, которую мы посчитаем нужно.

Для генерации схемы есть малофункциональный сервис от Google Markup-helper, но в нашем случае я активно использую Chatgpt, он очень даже отлично генерирует необходимый тип разметки Schema.

С чего же начать?

Отключаем стандартную Schema

В файл functions.php добавляем следующие строки. Для примера взят плагин All in One SEO.

				
					
add_filter( 'aioseo_schema_disable', 'aioseo_disable_schema' );

function aioseo_disable_schema( $disabled ) {
   return true;
}
				
			

Добавляем доп. поля для траниц и записей

В теле страницы и статьи появится дополнительное поле, куда и нужно будет добавлять разметку Schema.

				
					function add_custom_schema_metabox() {
    add_meta_box(
        'custom_schema_metabox',
        'Поле для новой Schema',
        'render_custom_schema_metabox',
        array('post', 'page'), // Типы записей, к которым привязывается метабокс
        'normal', // Позиция метабокса (normal, advanced, side)
        'high' // Приоритет метабокса (high, core, default, low)
    );
}
add_action('add_meta_boxes', 'add_custom_schema_metabox');

function render_custom_schema_metabox($post) {
    // Получаем значение метаполя, если оно уже существует
    $schema_code = get_post_meta($post->ID, '_custom_schema_code', true);

    // Выводим поле для ввода кода схемы
    echo '<textarea id="custom_schema_code" name="custom_schema_code" style="width:100%;" rows="10">' . esc_textarea($schema_code) . '</textarea>';
}

function save_custom_schema_code($post_id) {
    // Проверяем, является ли запрос автосохранением
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    // Проверяем права пользователя
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    // Проверяем, было ли передано значение поля
    if (isset($_POST['custom_schema_code'])) {
        // Сохраняем значение поля в метаполе с разрешенными тегами HTML
        update_post_meta($post_id, '_custom_schema_code', wp_kses_post($_POST['custom_schema_code']));
    }
}
add_action('save_post', 'save_custom_schema_code');

function output_custom_schema_json() {
    // Получаем текущий объект записи
    global $post;

    // Получаем значение метаполя с кодом схемы
    $schema_code = get_post_meta($post->ID, '_custom_schema_code', true);

    // Проверяем, существует ли значение
    if ($schema_code) {
        // Выводим JSON-код в теге <script>
        echo '<script type="application/ld+json">' . wp_kses_post($schema_code) . '</script>';
    }
}
add_action('wp_head', 'output_custom_schema_json');
				
			

Делаем общую Schema для всех страниц сайта

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

Следующий код добавляет общую схему для русской и украинской версии сайта (код добавляем опять таки в functions.php)

Для удобства, мы на нашем сайте разместили генератор Schema, с наиболее популярными ее типами.

				
					function add_schema_script() {
    if (function_exists('icl_object_id')) {
        $current_language = apply_filters('wpml_current_language', NULL);

        // Русс версия
        if ($current_language == 'ru') {
            ?>
<script type='application/ld+json'> 
{
  "@context": "http://www.schema.org",
  "@type": "MedicalOrganization",
  "name": "Health Care Solutions Inc.",
  "url": "https://healthcaresolutions.com",
  "logo": "https://healthcaresolutions.com/logo.svg",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Wellness Avenue",
    "addressLocality": "Springfield",
    "addressRegion": "IL",
    "postalCode": "62701",
    "addressCountry": "USA"
  },
  "contactPoint": {
    "@type": "ContactPoint",
    "telephone": "+1 (555) 123-4567"
  }
}
 </script>
            <?php
        }
        // Укр версия
        elseif ($current_language == 'uk') {
            ?>
 <script type='application/ld+json'> 
{
  "@context": "http://www.schema.org",
  "@type": "MedicalOrganization",
  "name": "Health Care Solutions Inc.",
  "url": "https://healthcaresolutions.com",
  "logo": "https://healthcaresolutions.com/logo.svg",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Wellness Avenue",
    "addressLocality": "Springfield",
    "addressRegion": "IL",
    "postalCode": "62701",
    "addressCountry": "USA"
  },
  "contactPoint": {
    "@type": "ContactPoint",
    "telephone": "+1 (555) 123-4567"
  }
}
 </script>
            <?php
        }
    }
}
add_action('wp_head', 'add_schema_script');
				
			

Полезные статьи