Открывать все внешние ссылки в новом окне – нужна помощь с кодом.

Вопрос или проблема

Я использую этот код, чтобы открывать все внешние ссылки в новом окне (сайт на основе WordPress):

/* ОТКРЫТЬ ВСЕ ВНЕШНИЕ ССЫЛКИ В НОВОЙ ВКЛАДКЕ */
function autoblank($text) {
$return = str_replace('href="https://wordpress.stackexchange.com/questions/331572/,"target="_blank" href=", $text);
$return = str_replace("target="_blank"
href="https://example.com',
'href="https://example.com', $return);
$return = str_replace('target="_blank" href="#"https://wordpress.stackexchange.com/questions/331572/,"href="#', $return);
$return = str_replace(' target = "_blank">"https://wordpress.stackexchange.com/questions/331572/,">', $return);
return $return;
}
add_filter('the_content"https://wordpress.stackexchange.com/questions/331572/,"autoblank');
add_filter('comment_text"https://wordpress.stackexchange.com/questions/331572/,"autoblank');

К сожалению, это не идеально, потому что также открывает внутренние ссылки в новом окне (только если они размещены в постах или страницах – пункты меню и т.п. открываются нормально). Есть ли у кого-нибудь идея, как изменить этот код, чтобы не открывать внутренние ссылки в новом окне?

Спасибо, Юрген, но в коде была ошибка, которую я исправил:

$('a').each(function() {

    /** Получаем текущее доменное имя */
    var currentHostname = new RegExp(window.location.host);

    /** Проверяем, если атрибут href ссылки имеет другое доменное имя, чем текущий сайт */
    if (!currentHostname.test(this.href)) {

        $(this).on('click', function(event) {

            event.preventDefault();
            event.stopPropagation();

            /** Создаем объект URL для ссылки */
            var url = new URL(this.href);

            /**
             * Проверяем, если ссылка имеет протокол http или https
             * в противном случае просто открываем все остальные протоколы (tel, mailto)
             */
            if (url.protocol == 'http:' || url.protocol == 'https:') {
                window.open(this.href, '_blank');
            } else {
                window.location.replace(this.href);
            }

        });
    }

});

Слишком сложно делать это с помощью php в WordPress, советую делать это на фронтенде с помощью немного магии jQuery. Я написал небольшой jQuery плагин, который открывает все внешние ссылки (все ссылки с другим доменом/именем хоста, чем текущий сайт) в новом окне.

Ознакомьтесь с плагином:
https://www.npmjs.com/package/jquery.jold.external-hrefs

Сделать это вручную, без плагина, тоже достаточно просто:

$('a').each(function() {

    /** Получаем текущее доменное имя */
    var a = new RegExp("https://wordpress.stackexchange.com/" + window.location.host + "https://wordpress.stackexchange.com/");

    /** Проверяем, если атрибут href ссылки имеет другое доменное имя, чем текущий сайт */
    if( !a.test(this.href) ) {

        $(this).on('click', function(event) {

            event.preventDefault();
            event.stopPropagation();

            /** Создаем объект url для ссылки */
            url = new URL(this.href);

            /**
             * Проверяем, если ссылки имеют протокол http
             * в противном случае просто открываем все остальные протоколы (tel, mailto)
             */
            if (url.protocol == 'http:' || url.protocol == 'https:') {
                window.open(this.href, '_blank');
            } else {
                window.location.replace(this.href);
            }

        });
    }

}

Ответ или решение

Для решения проблемы открытия всех внешних ссылок в новом окне на сайте WordPress необходимо понять текущее решение и предложить более оптимальный подход, учитывая представленный контекст.

Детальный обзор проблемы

Вы используете следующий код на PHP для автоматического открытия всех внешних ссылок в новых вкладках:

/* OPEN ALL OUTBOUND LINKS IN NEW TAB */
function autoblank($text) {
$return = str_replace('href=', '"target="_blank" href=', $text);
$return = str_replace("target="_blank" href='https://example.com'", 'href="https://example.com"', $return);
$return = str_replace('target="_blank" href="#', 'href="#', $return);
$return = str_replace('target="_blank">"https://wordpress.stackexchange.com/questions/331572/', '">', $return);
return $return;
}
add_filter('the_content', 'autoblank');
add_filter('comment_text', 'autoblank');

Проблемы с текущим решением

  1. Некорректный синтаксис: В коде имеются синтаксические ошибки, такие как отсутствующие или лишние кавычки.
  2. Недопустимое поведение: Все ссылки, включенные в посты или страницы, открываются в новых окнах, включая внутренние, что не соответствует ожидаемому результату.
  3. Сложность масштабирования: Решение через PHP может быть сложным и трудоемким для отладки, особенно если требуется определять внешние и внутренние ссылки.

Оптимальное решение

Предложенное решение — использовать jQuery для более простого и надежного открытия внешних ссылок в новом окне. Вот пример такого решения:

$(document).ready(function() {
    $('a').each(function() {
        var currentHostname = window.location.hostname;
        var linkHostname = this.hostname;

        if (linkHostname && linkHostname !== currentHostname) {
            $(this).attr('target', '_blank');
        }
    });
});

Пояснения к коду:

  1. Использование jQuery: Такой подход более удобен, так как jQuery легко интегрируется и не требует изменения серверного кода.
  2. Проверка домена: Скрипт проверяет, отличается ли доменное имя ссылки от текущего домена и, если да, добавляет атрибут target="_blank".

Заключение

Это решение значительно упрощает процесс управления поведением ссылок и сводит к минимуму возможные ошибки. Используйте jQuery для управления элементами на клиентской стороне, что позволяет легко обновлять или изменять логику обработки ссылок в будущем. Не забывайте оптимизировать и тестировать ваш код для обеспечения наилучшей производительности и пользовательского опыта.

Надеюсь, это решение поможет вам эффективно управлять файлами с внутренними и внешними ссылками на вашем WordPress сайте!

Оцените материал
Добавить комментарий

Капча загружается...