Drupal 8: Как удалить лишние HTML теги с атрибутом rel из head?

Cегодня поговорим о том, как удалить лишние теги из <head> сайта на Drupal 8.x. Речь пойдёт про эти теги (которые зачем-то были добавлены в ядро восьмёрки)

// ...
<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-1-name" />
// ...

Если верить моим наблюдениям (на основании двух сайтов на 8.х в ПС Яндекс), то эти HTML теги могли совершенно спокойно индексироваться (с ошибкой 403, естественно) и вылезать в поисковой выдаче. Не мне вам говорить, что это не есть хорошо, что Яндекс может применить санкции и так быть не должно.

Поиск решения

Начал я поиск, естественно, с Google и сразу же нашёл вот топик на d.org. Да, там выложен патч, который прямо в файлах ядра CMS добавляет строки с этими тегами в комментарий. Хм. «Править ядро = убивать котиков» (с) Друпал-сообщество.

Ищу дальше и натыкаюсь на issue для модуля Metatag, в котором только начинают решать эту проблему (и, на момент версии 1.0-beta5, ещё не решили). Мда. Решение-то нужно сейчас, а не потом!

Дальнейшие поиски в гугле и на профильных ресурсах (типа Drupal Answers) — вывели меня на единственную мысль: придётся самому решать эту проблему.

Модуль Unset HTML head link

Так как напрямую, через файл THEME.theme в шаблоне, повлиять на вывод этих тегов нельзя (даже через hook_page_attachments_alter()), то я написал свой маленький one-function модуль. Так и родился Unset HTML head link, который работает с отображением сущности, через hook_entity_view_alter().

Модуль выложен на GitHub, кому удобнее скачивать/смотреть код там, то вот ссылка.

Да, многие могут сказать, что «зачем это надо, скоро же этот функционал добавят в Metatag».. Но, во-первых, решение было нужно ещё вчера, во-вторых, неизвестно когда у разработчиков модуля дойдут до этого руки.

Листинг модуля

Листинг файла ./unset_html_head_link/unset_html_head_link.info.yml:

# Имя модуля.
name: Unset HTML head link
# Описание.
description: 'Module for unset any HTML links (like rel="delete-form" or rel="edit-form" and etc.) from head in Drupal 8.x sites.'
# Информация о модуле.
core: 8.x
type: module
package: SEO
# Версия модуля.
version: 1.0

Листинг файла ./unset_html_head_link/unset_html_head_link.module:

<?php

/**
 * Implements hook_entity_view_alter().
 */
function unset_html_head_link_entity_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {
  // Проверка view_mode ноды (удаляем эти теги только в полном отображении ноды).
  if ($build['#view_mode'] === 'full' && $entity Instanceof \Drupal\node\NodeInterface) {
    // Проверяем на существование html_head_link в head.
    if (!isset($build['#attached']['html_head_link'])) return;
    // Задаём массив с тегами для удаления.
    // Таким же образом, вы можете удалить любые теги, которые имеют вид <link rel="..." href="..." />,
    // в том числе и rel="canonical", rel="shortlink" или rel="shortcut icon".
    $unset_html_head_link = [      
      'delete-form',
      'edit-form',
      'version-history',
      'revision'
    ];
    // Собственно, сам цикл для удаления.
    foreach ($build['#attached']['html_head_link'] as $key => $value) {
      if (isset($value[0]['rel']) && in_array($value[0]['rel'], $unset_html_head_link)) unset($build['#attached']['html_head_link'][$key]);
    }
  }
}

Как удалить лишние теги на страницах терминов таксономии?

Очень просто! Допишите в файл unset_html_head_link.module следующий код:

/**
 * Implements hook_page_attachments_alter().
 */
function unset_html_head_link_page_attachments_alter(array &$attachments) {
  // Задаём массив с тегами для удаления.
  $unset_html_head_link = [
    'delete-form',
    'edit-form',
    'version-history',
    'revision'
  ];
  // Цикл для удаления.
  foreach ($attachments['#attached']['html_head_link'] as $key => $value) {
    if (isset($value[0]['rel']) && in_array($value[0]['rel'], $unset_html_head_link)) unset($attachments['#attached']['html_head_link'][$key]);
  }
}

/**
 * Implements hook_module_implements_alter().
 */
function unset_html_head_link_module_implements_alter(&$implementations, $hook) {
  // Определяем выполнение hook_page_attachments_alter() в самом конце.
  if ($hook === 'page_attachments_alter') {
    $group = $implementations['unset_html_head_link'];
    unset($implementations['unset_html_head_link']);
    $implementations['unset_html_head_link'] = $group;
  }
}

Установка и настройка

Всё, как всегда, проще простого:

  • Скачать ZIP-архив с модулем или создать файлы самому, пользуясь листингом выше.
  • Закачать в папку ./modules/ к себе на хостинг.
  • Включить данный модуль на странице admin/modules в разделе «Поисковая оптимизация».

Вот и всё, что нужно сделать. Не забудьте сбросить кэш!