Как добавить цель к ссылке

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

Существует ли фильтр, который я мог бы использовать для получения и изменения 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 вместе с регулярными выражениями. Этот подход позволит вам обойти все ссылки и добавить нужный атрибут к тем из них, которые соответствуют вашим критериям. Вот как вы можете это сделать:

  1. Откройте файл functions.php вашей активной темы. Это позволит вам добавить собственный код, который будет выполняться при выводе содержимого постов.

  2. Вставьте следующий код:

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 перед внесением изменений, чтобы избежать возможных проблем.

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

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