Узнайте, как легко добавлять, изменять и удалять метатеги в Drupal 8 без использования сторонних модулей.
На данный момент Metatag ещё не готов к продакшену, и следовательно, метатеги придется добавлять программно. Да и мало ли, metatag не панацея и не решение всех проблем, поэтому программный вариант будет нужен всегда.
У drupby появилась статья по тому как изменять и удалять метатеги. Но вот как добавлять почему-то нет, поэтому добавлю самю :)
Добавляем свой метатег на все страницы
Например, добавляем метатег title с содержимым Hello World.
<meta name="title" content="Hello World!">
В своём модуле пишем:
/**
* Implements hook_preprocess_html().
*/
function MYMODULE_preprocess_html(&$variables) {
$title = [
'#tag' => 'meta',
'#attributes' => [
'name' => 'title',
'content' => 'Hello World!',
],
];
$variables['#attached']['html_head'][] = [$title, 'title'];
}
Добавление метатега только на странице сущности
Пример выше добавит метатег вообще на все страницы сайта. Но что делать если надо только для определенной сущности?
/**
* 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() == 'node') {
$title = [
'#tag' => 'meta',
'#attributes' => [
'name' => 'title',
# В данном случае, заголовок в метатеге будет взят из сущности.
'content' => \Drupal\Component\Utility\SafeMarkup::checkPlain($entity->title->value),
],
];
$build['#attached']['html_head'][] = [$title, 'title'];
}
}
Также полезным может оказаться получение ID сущности, чтобы добавить метатег на странице только определенной сущности.
$entity->id();
И получение подтипа сущности (bundle):
$entity->bundle();
Вот и всё, а как удалять и изменять их - ссылка выше. Разница от добавления практически минимальная и в названии хука.
P.s. В Drupal 7 метатеги можно было менять, изменять, ну и добавлять в template.php (в файле темы), теперь править можно все также в файле темы THEMENAME.theme, а вот добавлять только в модуле. Т.е. хук из статьи работает только в модулях, а вот alter хука, доступен из темы. Спасибо drupby за поправку.
Комментарии
Ну я и затупок :) Решил не заморачиваться и копирнул из предыдущего примера :D Конечно не $page а $build там.
"В Drupal 7 метатеги можно было менять, изменять, ну и добавлять в template.php (в файле темы), сейчас только в модуле."
Вот изменять и удалять можно и в теме в файле THEMENAME.theme
добавление в hook_page_attachments() - да, только в модуле
Спасибо, подкорректировал.
А как проверить, является ли страница главной? Т.е. добавить только для главной страницы мета тэг. Если она создана через Page Manager.
$is_front_page = \Drupal::service('path.matcher')->isFrontPage();
Спасибо Никита.
$langcode в Drupal 8 нет вроде
Никит, подскажи пожалуйста, как удалить из head вот эти элементы:
(это после установки модуля Metatag появилось)
Вот элементы:
link rel="canonical" href="/page/article-1" />
link rel="shortlink" href="/node/1" />
link rel="delete-form" href="/node/1/delete" />
link rel="edit-form" href="/node/1/edit" />
link rel="version-history" href="/node/1/revisions" />
link rel="revision" href="/page/article-1" />
MYMODULE_page_attachments_alter()
MYMODULE_preprocess_html()
link rel="revision" - почему то там не находится
У этих тегов своя атмосфера, рекомендую вглянуть сюда https://www.drupal.org/project/metatag/issues/2625300#comment-11980262
Здравствуйте! Никита, я не программист и поэтому хочу попросить вас - подскажите подробнее куда именно этот код вставить. У меня сайт кулинарных рецептов на друпал 8 последней версии и я хочу добиться того, чтобы фотки рецептов (нод и терминов) попадали в снипет выдачи поиска гугла. Друпал 8 последней версии. Я думаю этот код поможет мне? Спасибо большое!
На данный момент есть модуль Metatag. Проще и быстрее всего поставить и использовать его. Там есть интерфейс для удобной настройки метатегов. Статья писалась когда он был не готов. На данный момент она больше познавательная как это реализуется на практике самостоятельно, нежели для практического применения.
Этот способ не работет для кастомных тегов. Например тег с произвольным именем 'name' => 'qwerty'
Что значит "тег с произвольным именем", если заменить meta
на qwerty
, всё также работает.
$title = [
'#tag' => 'querty',
'#attributes' => [
'name' => 'title',
'content' => 'Hello World!',
],
];
$variables['#attached']['html_head'][] = [$title, 'title'];
Выдаст:
<querty name="title" content="Hello World!"></querty>
Если речь про то, что тег закрывается, то список одиночных элементов перечислен в \Drupal\Core\Render\Element\HtmlTag::$voidElements
в соответствии с W3.
Откуда в MYMODULE_entity_view взялась переменная $page?