Lab / Drupal 8

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

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

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

Начал я поиск, естественно, с 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;
 }
}

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

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

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