Вопрос или проблема
Я использую этот код, чтобы открывать все внешние ссылки в новом окне (сайт на основе 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');
Проблемы с текущим решением
- Некорректный синтаксис: В коде имеются синтаксические ошибки, такие как отсутствующие или лишние кавычки.
- Недопустимое поведение: Все ссылки, включенные в посты или страницы, открываются в новых окнах, включая внутренние, что не соответствует ожидаемому результату.
- Сложность масштабирования: Решение через 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');
}
});
});
Пояснения к коду:
- Использование jQuery: Такой подход более удобен, так как jQuery легко интегрируется и не требует изменения серверного кода.
- Проверка домена: Скрипт проверяет, отличается ли доменное имя ссылки от текущего домена и, если да, добавляет атрибут
target="_blank"
.
Заключение
Это решение значительно упрощает процесс управления поведением ссылок и сводит к минимуму возможные ошибки. Используйте jQuery
для управления элементами на клиентской стороне, что позволяет легко обновлять или изменять логику обработки ссылок в будущем. Не забывайте оптимизировать и тестировать ваш код для обеспечения наилучшей производительности и пользовательского опыта.
Надеюсь, это решение поможет вам эффективно управлять файлами с внутренними и внешними ссылками на вашем WordPress сайте!