Программное добавление JSON-LD разметки на сайт.
Вам наверное часто приходилось, или же приходится добавлять семантические данные на страницу. Микроразметка, RDFa, schema.org и другие. Я думаю, что это всегда немного геморойное занятие, так как они напрямую вставляются в HTML разметку в качестве аттрибутов, требуют некую структуру и т.д. В общем и целом, в текущем виде они скорее заноза в одном месте, нежели удобные средства (я говорю именно о том как оно всё добавляется, а не о пользе самих микроразметок).
Видимо у народа накипело, и появился стандарт (а не просто чья-то поделка) json-ld. Он, по сути, является надстройкой над микроразметкой, схемой и т.д. Он позволяет использовать любой из этих стандартов, но записывать их не в атрибуты html тегов, а в формате 1 JSON строки вверху сайта. Это ли не круто? Вместо писанины кучи тегов, атрибутов, достаточно сформировать JSON и вставить его в <head>
. Этот стандарт поддерживается как Google, так и Yandex в полном объеме. Так что, совершенно очевидно, за ним будущее ибо он проще, удобнее и гибче. Собственно я расскажу как его добавлять на страницы в Drupal 8.
Пример вставки json-ld ¶
На самом то деле, я решил эту статью написать после статьи о программном добавлении метатегов ибо их подход совершенно идентичен. Я давно уже хотел про json-ld что-то написать, решил попробовать его применить по принципу метатегов, и оно сработало :)
Если зайти на сайт json-ld то можно увидеть пример:
![Пример Пример](/web/20210301093814im_/https://niklan.net/sites/default/files/styles/paragraph_image_image_xl/public/paragraphs/field_image/2016-08/1%20%2838%29.png?itok=oPW4vXfV)
Давайте его добавим на все страницы сайта (пока это не особо важно). В данном примере больше всего вас должен заинтересовать синтаксис 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'];
}
И на каждой странице должен появиться наш тег с данными:
![Результат Результат](/web/20210301093814im_/https://niklan.net/sites/default/files/styles/paragraph_image_image_xl/public/paragraphs/field_image/2016-08/2%20%2832%29.png?itok=sbWCk8wE)
По сути это всё что нужно знать.
Добавление JSON-LD на страницу пользователя ¶
Как я уже написал, то что выше - это все что нужно знать, дальше дело фанатазии и потребностей.
Для примера, давайте добавим информцию schema.org Person. Думаю нам хватит таких данных: имя, должность, телефон и адрес сайта. Разумеется, так как мы уже добавляем динамический json-ld, нам придется тянуть данные из профиля пользователя, а чтобы их оттуда тянуть, они там должны как-то храниться. Не выдумывая ничего, я просто добавил соответствующие поля:
![Поля в профиле Поля в профиле](/web/20210301093814im_/https://niklan.net/sites/default/files/styles/paragraph_image_image_xl/public/paragraphs/field_image/2016-08/3%20%2826%29.png?itok=VOzf5bsJ)
Затем, когда у нас есть поля, нам достаточно их вывести:
/**
* 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'];
}
}
И смотрим что на странице:
![Результат в профиле Результат в профиле](/web/20210301093814im_/https://niklan.net/sites/default/files/styles/paragraph_image_image_xl/public/paragraphs/field_image/2016-08/4%20%2824%29.png?itok=Qqk6wNcR)
Вот так вот просто добавляются семантические данные, без возни с тегами, без возни с оберткой. Просто и понятно в одном хуке.
Комментарии
Спасибо, поправил.
Сразу видно, что Вы адекватный и не гордый человек. Я один раз отправил письмо инженеру в компании, где я работаю, письмо о том, что у него ошибки в его статье. Так он меня скрыто, но прямо, послал.
12
Здравствуйте, появиласьстабильная 8рка, вопрос если сайт стоит на нем материала более 800, сайту 2 года,стоит на 7рке, вопрос можно ли уже переходитьили еще подождать? Буду ли потери при переходе? Если у сайта проблемы с кешем-много занимает места на хосте, нужно ли решатьэтот вопрос на 7рке или уже решитьвопрос после перехода? Заранее спасибо!
Здравствуйте. Смотри сами и решайте от задач. 8-ка стабильная, но множество контриба еще не портировано в стабильные версии.
1 материал, или 100 тысяч, не важно, важнее другоей. Как он сделан, что используется на сайте. Мигрировать материал не сложно, а вот перенести сопутсвующий функционал - задач. Сделайте анализ, без каких модулей ваш сайт не может жить, и вы не сможете их как-то подменить кастомными модулями или решениями. Сделайте их в табличку, затем открывайте их проекты на drupal.org и смотрите, готов? хорошо, нет? Здавайте себе вопрос, заменяем кастомом или нет?
Например metatag, есть, но не стабилен, в принципе, я могу отказаться от него, в коде их обьявить не так сложно, не сильно затратное действие.
Или взять search api + facet api. Да, может я написать такое смогу, но пока я его пишу уже выйдет стабильная версия для этих модулей. Тут выход один - ждать их релиза, и если без них мой сайт потеряет важный функционал - это проблема, это знчаит переход надо откаладывать.
В общем делайтей анализ, затем локально пробуйте. Только тогда вы поймете, можно вам переходить на него, или нет. Сама по себе 8 -ка на удивление очень стабильна, но вот контриб...
Спасибо, то есть вы советуете подождать с переходом ? И подождать с установкой boost до перехода?
Вопрос к тебе, как к программисту Drupal... На какой ос сидишь? OS X или Windows 10/8/7. Работаешь на ноуте или на PC. И, в одной из статей ты писал про то что перешел на PhpStorm. Сейчас сидишь на их подписке или будешь пользоваться старым пакетом?
Linux — конкретно сейчас Netrunner 17. Работаю на стационаре, на ноутах мне неудобно. На phpstorm так и сижу, на новой версии 10 или 9 там, даже не помню, там по сути мало что меняелось за последние три версии, особо разинцы не заметил.
А то что кириллица преобразуется в набор символов - это разве нормально ?
Google и Яндекс в своих тестах микроразметки говорят всё валидно.
"не же ле" -> "нежели"
после правки коммент можно удалить :)