Вы здесь

Как переопределить META теги в head для Drupal 8?

2

Hello world!

Продолжаю ковырять D8.

Ранее, если надо было переопределить вывод МЕТА тегов для шаблона D7, то работал вот этот код в template.php:

function MYTHEME_html_head_alter(&$head_elements) {
  // Unset all.
  $remove_array = array(
    'system_meta_content_type', 
    'system_meta_generator', 
    'system_shortcut_icon', 
    'metatag_canonical',
  );
  foreach ($remove_array as $key) {
    if ($head_elements[$key]) {
      unset($head_elements[$key]);
    }
  }
  // Optimize the mobile viewport.
  $head_elements['mobile_viewport'] = array(
    '#type' => 'html_tag',
    '#tag' => 'meta',
    '#weight' => -10,
    '#attributes' => array(
        'name' => 'viewport',
        'content' => 'initial-scale=1.0, maximum-scale=1.0, user-scalable=no, width=device-width',
    ),
  );
  // ...
  // И ещё много других МЕТА тегов
  // ...
}

Теперь же, из-за отсутствия hook_html_head_alter() под восьмёрку, это уже не работает. Вопрос: как это можно сделать? Через какой хук?

Просто вот такие элементы в head — это вообще не тру:

<meta name="Generator" content="Drupal 8 (https://www.drupal.org)">
<meta name="MobileOptimized" content="width">
<meta name="HandheldFriendly" content="true">

Должно быть совсем не так..

Да, есть модуль Metatag, но хоть на d.org и выложена версия 8.x-1.0-beta2, но она по прежнему не доделана: Metatag не заменяет, например, стандартный Generator или Canonical Link, модуль просто фигачит свои и теги повторяются. Также иногда лезут ошибки (возможно, это только у меня так — кто юзает и всё ОК, отпишитесь пожалуйста). Но ребята там что-то пишут/правят, судя по гитхабу.. Может быть скоро и напильник не нужен будет :)

Версия Drupal: 
8.x
Категория: 
Theming
Связанные проекты: 
Metatag
Вопрос задан 24.11.2015 - 11:03

Валерий Таранец
https://www.drupal.org/theme-guide/8

И? Если не знаете, лучше просто молча мимо пройдите.

Вы поленились копнуть чуть глубже.. https://www.drupal.org/node/1920746

Там ни слова про MYTHEME.theme файл и переопределение элементов (мета тегов) в head шаблона.. даже по аналогии с теми примерами, там не за что зацепиться.

ОК.

С переопределением, вроде как разобрался, делается через хук hook_page_attachments_alter(). Стандартный viewport можно переопределить, например, вот так:

function MYTHEME_page_attachments_alter(array &$page) {
    $viewport = array(
      '#type' => 'html_tag',
      '#tag' => 'meta',
      '#attributes' => array(
        'name' => 'viewport',
        'content' => 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no',
      ),
    );
    $page['#attached']['html_head'][] = [$viewport, 'viewport'];
  }

Но вопрос всё тот же: как вырезать (unset(), например) некошерные generator и, теперь уже не нужные, MobileOptimized и HandheldFriendly?

Комментарий оставлен 24.11.2015 - 16:02

Ответы

4

Но вопрос всё тот же: как вырезать (unset(), например) некошерные generator и, теперь уже не нужные, MobileOptimized и HandheldFriendly?

Как то так:

function  ИМЯТЕМЫ_page_attachments_alter(array &$attachments) {
  $unneeded_meta = ['HandheldFriendly', 'MobileOptimized', 'system_meta_generator'];
  foreach ($attachments['#attached']['html_head'] as $id => $attachment) {
    if (in_array($attachment[1], $unneeded_meta)) {
      unset($attachments['#attached']['html_head'][$id]);
    }
  }
}
Ответ дан 24.11.2015 - 16:28
Аватар пользователя drupby
drupby
450

хехе, тоже хотел написать про это :)

Комментарий оставлен 25.11.2015 - 08:12

Да, спасибо! Как раз то, что надо.

P.S. Только сам хотел написать более короткий вариант с in_array(), а вижу — уже исправили ответ :)

ADD: вот тут тоже неплохо написано про организацию META тегов и настройку модуля Metatags. Оставлю тоже тут, мало ли кому пригодится.

Комментарий оставлен 29.11.2015 - 23:49
2

При помощи hook_page_attachments(). Вы правильно копать стали в сторону его альтера. Вот добавление, аналогично и альтерится.

/**
 * Implements hook_page_attachments().
 */
function MYMODULE_page_attachments(array &$page) {
  $title = [
    '#tag' => 'meta',
    '#attributes' => [
      'name' => 'title',
      'content' => 'Hello World!',
    ],
  ];
  $page['#attached']['html_head'][] = [$title, 'title'];
}

Result

P.s. хук работает только в модуле. В теме не будет.

P.p.s. промохал что вырезать надо, а не добавлять >< Ну пусть мой ответ как пример добавления будет попутно. Вижу что drupby дал правильнее ответ.

Ответ дан 24.11.2015 - 16:27
Аватар пользователя Niklan
Niklan
441

А я ещё думаю, чего это Никита советует сделать? Мне же не то совсем надо :)
Да, это полезно будет, кто в будущем будет искать, плюсанул.

Комментарий оставлен 25.11.2015 - 07:43
0

Собственно, решение:
В файле THEMENAME.theme

function THEMENAME_preprocess_html(&$variables) {
  $i=0;
  $unwanted_meta=array('system_meta_generator','MobileOptimized','HandheldFriendly');
  foreach($variables['page']['#attached']['html_head'] as $key=>$value){
    if(in_array($value[1],$unwanted_meta)){
      unset($variables['page']['#attached']['html_head'][$i]);
    }
    $i++;
  }
}
Ответ дан 24.11.2015 - 22:37