<?php
// src/Plugin/Filter/NofollowExternalLinksFilter.php
namespace Drupal\modulename\Plugin\Filter;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\UrlHelper;
use Drupal\filter\FilterProcessResult;
use Drupal\filter\Plugin\FilterBase;
/**
* @Filter(
* id = "nofollow_external_links_filter",
* title = @Translation("Nofollow external links"),
* description = @Translation("Add attribute rel=nofollow to external links."),
* type = Drupal\filter\Plugin\FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE,
* weight = 20,
* )
*/
class NofollowExternalLinksFilter extends FilterBase {
/**
* {@inheritdoc}
*/
public function process($text, $langcode) {
$result = new FilterProcessResult($text);
if (stripos($text, '<a') !== FALSE) {
$html_dom = Html::load($text);
$links = $html_dom->getElementsByTagName('a');
foreach ($links as $link) {
if (UrlHelper::isExternal($link->getAttribute('href'))) {
$link->setAttribute('rel', 'nofollow');
}
}
$result->setProcessedText(Html::serialize($html_dom));
}
return $result;
}
}
Написанное актуально для
Drupal 8+
Похожие записи
- Текстовый фильтр, оборачивающий контент ссылок в span
- Создание своего текстового фильтра (оборачиваем таблицы в div)
- Вставка в CKEditor видео из ВКонтакте и Rutube (расширение модуля CKEditor 5 Media Embed)
- Как из PhpStorm выполнить тест(ы)
- Как работает опция "Aggregation type" в настройках полей Views при включённой агрегации
Комментарии
Было бы невероятно шикарно, если бы можно было добавить исключения, если я хочу дуфолоу оставлять некоторым ссылкам типа Википедии, хабра и прочих авторитетных ресурсов.
Андрей, я далеко не Друпал-гуру, однако не часто, но стабильно захожу почитать ваши с Никитой блоги, сидя, в основном, в read-only. Был сильно занят в связи с коронавирусной шизой, и только сейчас, на выходных прочитал этот пост.
Разумеется, я видел пост "Куда пихать твой чёртов код", но он достаточно старый, и перед тем, как разбираться в коде глубже, хотел бы уточнить: вот этот код выше, он тоже полностью самодостаточен в плане использования в виде собственного модуля?
Почему спрашиваю: у нас есть сайт на Друпале, на котором используется встроенный в Друпал дефолтный форум. И к ссылкам, которые там публикуют (в большом количестве), я бы хотел добавить редирект.
Возможно, вы помните такой проект, как DrupalCookBook (ныне почивший), у них был модуль "Noindex External Links". У меня была мысль доработать его, но этот модуль дальше не развивается.
Я хочу получить ссылки вот такого вида: https://xn----7sbbfbnfa0a2audfacc2cat8e9f.xn--p1ai/go.php?to=https%3A%2F%2Fwww.drupal.org%2Fproject%2Fnoindex_external_links
(это ссылка как раз на модуль "Noindex External Links")
Подойдёт ли код из этого поста для доработки с целью получения таких ссылок?
--------------------------------
Гостю выше, интересующемуся исключениями:
Если я правильно понимаю код, то вам надо в
foreach
передif (UrlHelper::isExternal...
добавить вот такую конструкцию:И добавить аналогичные if'ы для других сайтов.
Это, конечно, жёстко зашитый костыль с не самой высокой эстетичностью, но по идее он должен работать. Если нет, то полагаю, что Андрей меня поправит.
Конкретно этот код самодостаточен (разумеется вам ещё понадобится .info.yml модуля и действия по включению фильтра в настройках текстового формата).
Добавить что-то в href можно точно так же как и в другие атрибуты:
Добавить комментарий