Drupal 8: Добавление JSON-LD

28.11.2015

Вам наверное часто приходилось, или же приходится добавлять семантические данные на страницу. Микроразметка, RDFa, schema.org и другие. Я думаю, что это всегда немного геморойное занятие, так как они напрямую вставляются в HTML разметку в качестве аттрибутов, требуют некую структуру и т.д. В общем и целом, в текущем виде они скорее заноза в одном месте, нежели удобные средства (я говорю именно о том как оно всё добавляется, а не о пользе самих микроразметок).

Видимо у народа накипело, и появился стандарт (а не просто чья-то поделка) json-ld. Он, по сути, является надстройкой над микроразметкой, схемой и т.д. Он позволяет использовать любой из этих стандартов, но записывать их не в атрибуты html тегов, а в формате 1 JSON строки вверху сайта. Это ли не круто? Вместо писанины кучи тегов, атрибутов, достаточно сформировать JSON и вставить его в <head>. Этот стандарт поддерживается как Google, так и Yandex в полном объеме. Так что, совершенно очевидно, за ним будущее ибо он проще, удобнее и гибче. Собственно я расскажу как его добавлять на страницы в Drupal 8.

Пример вставки json-ld

На самом то деле, я решил эту статью написать после статьи о программном добавлении метатегов ибо их подход совершенно идентичен. Я давно уже хотел про json-ld что-то написать, решил попробовать его применить по принципу метатегов, и оно сработало :)

Если зайти на сайт json-ld то можно увидеть пример:

Пример
Пример

Давайте его добавим на все страницы сайта (пока это не особо важно). В данном примере больше всего вас должен заинтересовать синтаксис render array для json-ld:

/**
 * Implements hook_page_attachments().
 */
function MYMODULE_page_attachments(array &$page) {
  # Наш render array.
  $json_ld = [
    # Тип тега HTML, по стандарту json-ld - он <script>
    '#tag' => 'script',
    # Атрибут type по стандарту должен быть такого значения. Никаким другим.
    '#attributes' => [
      'type' => 'application/ld+json',
    ],
    #
    '#value' => \Drupal\Component\Serialization\Json::encode([
      '@context' => 'http://json-ld.org/contexts/person.jsonld',
      '@id' => 'http://dbpedia.org/resource/John_Lennon',
      'name' => 'John Lennon',
      'born' => '1940-10-09',
      'spouse' => 'http://dbpedia.org/resource/Cynthia_Lennon',
    ])
  ];

  $page['#attached']['html_head'][] = [$json_ld, 'json-ld'];
}

И на каждой странице должен появиться наш тег с данными:

Результат
Результат

По сути это всё что нужно знать.

Добавление JSON-LD на страницу пользователя

Как я уже написал, то что выше - это все что нужно знать, дальше дело фанатазии и потребностей.

Для примера, давайте добавим информцию schema.org Person. Думаю нам хватит таких данных: имя, должность, телефон и адрес сайта. Разумеется, так как мы уже добавляем динамический json-ld, нам придется тянуть данные из профиля пользователя, а чтобы их оттуда тянуть, они там должны как-то храниться. Не выдумывая ничего, я просто добавил соответствующие поля:

Поля в профиле
Поля в профиле

Затем, когда у нас есть поля, нам достаточно их вывести:

/**
 * Implements hook_entity_view().
 */
function MYMODULE_entity_view(array &$build, \Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display, $view_mode, $langcode) {
  # Добавляем только к сущности "пользователь"
  # Также мы будем выводить данные только на странице пользователя. Ведь нам
  # не нужно выводить их везде где выводятся пользователи, а толкьо на его
  # конкретной странице.
  if ($entity->getEntityTypeId() == 'user' && $view_mode == 'full') {
    $json_ld = [
      '#tag' => 'script',
      '#attributes' => [
        'type' => 'application/ld+json',
      ],
      '#value' => \Drupal\Component\Serialization\Json::encode([
        '@context' => 'http://schema.org/',
        '@type' => 'Person',
        'name' => $entity->field_name->value,
        'jobTitle' => $entity->field_post->value,
        'telephone' => $entity->field_phone->value,
        'url' => $entity->field_website->uri,
      ])
    ];

    $build['#attached']['html_head'][] = [$json_ld, 'json-ld'];
  }
}

И смотрим что на странице:

Результат в профиле
Результат в профиле

Вот так вот просто добавляются семантические данные, без возни с тегами, без возни с оберткой. Просто и понятно в одном хуке.

Комментарии

А
Антон
28.11.2015

"не же ле" -> "нежели"

после правки коммент можно удалить :)

N
Niklan
28.11.2015

Спасибо, поправил.

A
AqPro
30.11.2015

Сразу видно, что Вы адекватный и не гордый человек. Я один раз отправил письмо инженеру в компании, где я работаю, письмо о том, что у него ошибки в его статье. Так он меня скрыто, но прямо, послал.

S
Som
21.02.2016

12

Ю
Юлия
02.12.2015

Здравствуйте, появиласьстабильная 8рка, вопрос если сайт стоит на нем материала более 800, сайту 2 года,стоит на 7рке, вопрос можно ли уже переходитьили еще подождать? Буду ли потери при переходе? Если у сайта проблемы с кешем-много занимает места на хосте, нужно ли решатьэтот вопрос на 7рке или уже решитьвопрос после перехода? Заранее спасибо!

N
Niklan
02.12.2015

Здравствуйте. Смотри сами и решайте от задач. 8-ка стабильная, но множество контриба еще не портировано в стабильные версии.

1 материал, или 100 тысяч, не важно, важнее другоей. Как он сделан, что используется на сайте. Мигрировать материал не сложно, а вот перенести сопутсвующий функционал - задач. Сделайте анализ, без каких модулей ваш сайт не может жить, и вы не сможете их как-то подменить кастомными модулями или решениями. Сделайте их в табличку, затем открывайте их проекты на drupal.org и смотрите, готов? хорошо, нет? Здавайте себе вопрос, заменяем кастомом или нет?

Например metatag, есть, но не стабилен, в принципе, я могу отказаться от него, в коде их обьявить не так сложно, не сильно затратное действие.

Или взять search api + facet api. Да, может я написать такое смогу, но пока я его пишу уже выйдет стабильная версия для этих модулей. Тут выход один - ждать их релиза, и если без них мой сайт потеряет важный функционал - это проблема, это знчаит переход надо откаладывать.

В общем делайтей анализ, затем локально пробуйте. Только тогда вы поймете, можно вам переходить на него, или нет. Сама по себе 8 -ка на удивление очень стабильна, но вот контриб...

Ю
Юлия
04.12.2015

Спасибо, то есть вы советуете подождать с переходом ? И подождать с установкой boost до перехода?

Р
Руслан
13.01.2016

Вопрос к тебе, как к программисту Drupal... На какой ос сидишь? OS X или Windows 10/8/7. Работаешь на ноуте или на PC. И, в одной из статей ты писал про то что перешел на PhpStorm. Сейчас сидишь на их подписке или будешь пользоваться старым пакетом?

N
Niklan
14.01.2016

Linux — конкретно сейчас Netrunner 17. Работаю на стационаре, на ноутах мне неудобно. На phpstorm так и сижу, на новой версии 10 или 9 там, даже не помню, там по сути мало что меняелось за последние три версии, особо разинцы не заметил.

P
Pavel
сегодня

А то что кириллица преобразуется в набор символов - это разве нормально ?

N
Niklan
сегодня

Google и Яндекс в своих тестах микроразметки говорят всё валидно.

Содержимое данного поля является приватным и не предназначено для показа.