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;
}
}
Установка и настройка
Всё, как всегда, проще простого:
- Скачать ZIP-архив с модулем или создать файлы самому, пользуясь листингом выше.
- Закачать в папку
./modules/
к себе на хостинг. - Включить данный модуль на странице
admin/modules
в разделе «Поисковая оптимизация».
Вот и всё, что нужно сделать. Не забудьте очистить кэш!