Drupal 8: Программное добавление метатегов

На данный момент Metatag ещё не готов к продакшену, и следовательно, метатеги придется добавлять программно. Да и мало ли, metateg не панацея и не решение всех проблем, поэтому программный вариант будет нужен всегда.

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

Оставайся на связи

Будь всегда в курсе новых материалов! Подписывайся на каналы\паблики\рассылки чтобы получать оперативные оповещения.

Комментарии

x
xandeadx 25.11.2015 - 11:11

Откуда в MYMODULE_entity_view взялась переменная $page?

Ответ на от xandeadx (не проверено)

N
Niklan 25.11.2015 - 11:11

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

d
drupby 25.11.2015 - 11:11

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

Д
Дмитрий 26.11.2015 - 10:11

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

Д
Дмитрий 29.11.2015 - 09:11

$langcode в Drupal 8 нет вроде

В
Вик 30.11.2015 - 08:11

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

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

Ответ на от Вик (не проверено)

Г
Гость 30.11.2015 - 08:11

Вот элементы:

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" />

Р
Рауф 03.01.2018 - 17:01

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

Ответ на от Рауф (не проверено)

N
Niklan 05.01.2018 - 11:01

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

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

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