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

25.11.2015

На данный момент 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

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

N
Niklan
25.11.2015

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

d
drupby
25.11.2015

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

N
Niklan
25.11.2015

Спасибо, подкорректировал.

Д
Дмитрий
26.11.2015

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

N
Niklan
26.11.2015

$is_front_page = \Drupal::service('path.matcher')->isFrontPage();

Д
Дмитрий
26.11.2015

Спасибо Никита.

Д
Дмитрий
29.11.2015

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

В
Вик
30.11.2015

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

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

Г
Гость
30.11.2015

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

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

N
Niklan
01.09.2016

MYMODULE_page_attachments_alter() MYMODULE_preprocess_html()

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