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

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

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