Вопрос или проблема
Существует ли фильтр, который я мог бы использовать для получения и изменения HTML-вывода ссылки? В некоторых случаях мне нужно добавить target=”_blank”.
Я использую фильтр post_link, чтобы изменить сам URL, где это необходимо, но мне также нужно уметь изменять HTML-часть. Я не могу найти подходящий фильтр, натолкнулся на фильтр “edit_post_link”, но он не помог, так как, похоже, он работает только на серверной стороне.
Спасибо всем, кто может дать мне подсказку!
Если вы используете фильтр “the_content”, вы можете воспользоваться комбинацией операторов preg_...
, чтобы пройтись по всем ссылкам, добавляя target=”_blank” к тем, которые соответствуют вашим конкретным требованиям. Вы можете добавить этот фильтр в ваш functions.php или к выбранной странице, посту или категории шаблонам.
add_filter( 'the_content', 'ex1_the_content_filter' );
function ex1_the_content_filter($content) {
// находит все ссылки в вашем контенте
preg_match_all('/(\<a href=.*?a>)/',$content,$matches, PREG_SET_ORDER);
// перебирает все совпадения
foreach($matches as $m){
// потенциальная ссылка для замены...
$toReplace = $m[0];
// если текущая ссылка еще не имеет target="{что угодно}"
// Вы можете добавить любые дополнительные "IF" к этому условию
if (!preg_match('/target\s*\=/',$toReplace)){
// добавляет target="_blank" к текущей ссылке
$replacement = preg_replace('/(\<a.*?)(\>)(.*?\/a\>.*?)/','$1 target="_blank"$2$3',$toReplace);
// заменяет текущую ссылку на строку $replacement
$content = str_ireplace($toReplace,$replacement,$content);
}
}
return $content;
}
Ответ или решение
Чтобы добавить атрибут target="_blank"
к ссылкам в содержимом WordPress, вы можете воспользоваться фильтром the_content
вместе с регулярными выражениями. Этот подход позволит вам обойти все ссылки и добавить нужный атрибут к тем из них, которые соответствуют вашим критериям. Вот как вы можете это сделать:
-
Откройте файл
functions.php
вашей активной темы. Это позволит вам добавить собственный код, который будет выполняться при выводе содержимого постов. -
Вставьте следующий код:
add_filter('the_content', 'add_target_blank_to_links');
function add_target_blank_to_links($content) {
// Находим все ссылки в содержимом
preg_match_all('/<a href="(.*?)">(.*?)<\/a>/', $content, $matches, PREG_SET_ORDER);
// Проходим по всем найденным ссылкам
foreach ($matches as $m) {
// Потенциальная ссылка для замены
$toReplace = $m[0];
// Если текущая ссылка не содержит target="{что-то}"
if (!preg_match('/target\s*=\s*"/', $toReplace)) {
// Добавляем target="_blank" к текущей ссылке
$replacement = preg_replace('/(<a\s+.*?)(>)/', '$1 target="_blank"$2', $toReplace);
// Заменяем текущую ссылку на строку с $replacement
$content = str_ireplace($toReplace, $replacement, $content);
}
}
return $content;
}
Пояснения к коду:
add_filter('the_content', 'add_target_blank_to_links');
— добавляет новый фильтр к содержимому поста.- Функция
add_target_blank_to_links
обрабатывает содержимое поста, используя регулярные выражения для поиска ссылок. preg_match_all
ищет все ссылки в содержимом и сохраняет их в массив$matches
.- Цикл
foreach
проходит по всем найденным ссылкам, проверяя, есть ли уже атрибутtarget
. Если его нет, то с помощьюpreg_replace
мы добавляемtarget="_blank"
. - В конце, с помощью
str_ireplace
, мы заменяем оригинальную ссылку на обновленную.
Этот код будет добавлять атрибут target="_blank"
ко всем ссылкам в содержимом поста, которые не имеют этого атрибута, что позволит открывать ссылки в новой вкладке. Если вам нужно применять правила к определённым ссылкам, вы можете добавить дополнительные условия перед добавлением атрибута.
Не забудьте сделать резервную копию вашего functions.php
перед внесением изменений, чтобы избежать возможных проблем.