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

По мотивам вопроса http://dru.io/question/4777 ("Как переопределить META теги в head для Drupal 8?"), в котором автор вопроса решал задачу удаления ненужных ему мета-тегов в Drupal 8, решил написать этот небольшой сниппет. В Drupal 7 такая задача решалась в hook_html_head_alter(), которого в Drupal 8 уже нету. В Drupal 8 эту задачу решит использование hook_page_attachments_alter(), который служит для удаления или изменения библиотек, мета тегов, тегов link и http заголовков. Хук вызывается сразу после вызова hook_page_attachments() и перед рендером страницы.

Рассмотрим пример удаления мета-тегов Generator, MobileOptimized и HandheldFriendly. Имплементируем hook_page_attachments_alter в файле THEMENAME.theme используемой темы или в модуле:


function  THEMENAME_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]);
    }
  }
}

В качестве примера изменения мета-тегов рассмотрим модификацию viewport. Drupal 8 изначально выводит viewport так:


<meta name="viewport" content="width=device-width, initial-scale=1.0" />

Его нужно изменить на такой вариант:


<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

Соответственно изменяем его в hook_page_attachments_alter в THEMENAME.theme:


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