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

25.11.2015 13

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

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

N
Niklan # 25.11.2015 - 11:27

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

d
drupby # 25.11.2015 - 11:51

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

Д
Дмитрий # 26.11.2015 - 10:46

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

Д
Дмитрий # 29.11.2015 - 09:55

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

В
Вик # 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" />

Р
Рауф # 03.01.2018 - 17:29

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

N
Niklan # 05.01.2018 - 11:02

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

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

В комментариях присутствует поддержка Markdown синтаксиса. Показать подсказку.
Ссылка
[Заголовок](http://google.ru)
Код в строку
`print "Hello World";`
Многострочный код
```php print "Hello World"; ```
Жирный текст
*Текст*
Курсивный текст
_Текст_