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 за поправку.

Комментарии

Niklan
ср, 25/11/2015 - 11:27

Ну я и затупок :) Решил не заморачиваться и копирнул из предыдущего примера :D Конечно не $page а $build там.

drupby
ср, 25/11/2015 - 11:51

"В Drupal 7 метатеги можно было менять, изменять, ну и добавлять в template.php (в файле темы), сейчас только в модуле."
Вот изменять и удалять можно и в теме в файле THEMENAME.theme
добавление в hook_page_attachments() - да, только в модуле

Дмитрий
чт, 26/11/2015 - 10:46

А как проверить, является ли страница главной? Т.е. добавить только для главной страницы мета тэг. Если она создана через Page Manager.

Вик
пн, 30/11/2015 - 08:53

Никит, подскажи пожалуйста, как удалить из head вот эти элементы:

(это после установки модуля Metatag появилось)

Гость
пн, 30/11/2015 - 08:54

Вот элементы:
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" />

Niklan
вт, 14/05/2019 - 07:31

У этих тегов своя атмосфера, рекомендую вглянуть сюда https://www.drupal.org/project/metatag/issues/2625300#comment-11980262

Рауф
ср, 03/01/2018 - 17:29

Здравствуйте! Никита, я не программист и поэтому хочу попросить вас - подскажите подробнее куда именно этот код вставить. У меня сайт кулинарных рецептов на друпал 8 последней версии и я хочу добиться того, чтобы фотки рецептов (нод и терминов) попадали в снипет выдачи поиска гугла. Друпал 8 последней версии. Я думаю этот код поможет мне? Спасибо большое!

Niklan
пт, 05/01/2018 - 11:02

На данный момент есть модуль Metatag. Проще и быстрее всего поставить и использовать его. Там есть интерфейс для удобной настройки метатегов. Статья писалась когда он был не готов. На данный момент она больше познавательная как это реализуется на практике самостоятельно, нежели для практического применения.

Truman
вс, 17/01/2021 - 22:07

Этот способ не работет для кастомных тегов. Например тег с произвольным именем 'name' => 'qwerty'

Niklan
пн, 18/01/2021 - 16:13

Что значит "тег с произвольным именем", если заменить 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.

Добавить комментарий

Поддерживается Markdown
Поделиться