Вопрос или проблема
Я ищу способ игнорировать любые <a>
ссылки в содержимом, которое WP отображает в the_excerpt
– существует ли способ, которым я могу это достичь?
Вырезка на самом деле не используется на странице WP, поэтому отображается основная область контента страницы – но я хочу убедиться, что любые <a>
ссылки не включены. Это возможно?
Так что я ищу, чтобы если вырезка была такой:
Привет, это содержимое, которое в настоящее время включено в the_excerpt, с <a><span>ссылка</span></a> здесь и еще немного контента здесь....
Тогда вывод the_excerpt
удалит весь элемент <a>
, и вырезка станет:
Привет, это содержимое, которое в настоящее время включено в the_excerpt, с здесь и еще немного контента здесь....
Чтобы отобразить содержимое, я использую:
<p><?php the_excerpt(); ?></p>
Обновление – Поле вырезки на самом деле пустое на страницах, на которые я ссылаюсь в цикле, поэтому оно по умолчанию выбирает содержимое из основной области тела страницы. Я полагаю, это изменяет код, который может потребоваться применить здесь?
Кастомный код темы для получения контента страницы, если the_excerpt пустой, таков:
if ( has_excerpt() ) {
$the_excerpt = get_the_excerpt();
$the_excerpt = preg_replace( '/\[[^\]]+\]/', '', $the_excerpt ); // удаляет шорткоды, сохраняет содержимое шорткодов
return wp_trim_words( $the_excerpt, $limit );
} else {
$the_content = get_the_content();
$the_content = preg_replace( '/\[[^\]]+\]/', '', $the_content ); // удаляет шорткоды, сохраняет содержимое шорткодов
return wp_trim_words( $the_content, $limit );
}
}
Чтобы удалить теги <a>...</a>
из вывода функции the_excerpt()
, вы можете использовать фильтр the_excerpt
и регулярное выражение для поиска и замены.
Обновлено: В ответ на комментарий я обновил код — регулярное выражение в частности — чтобы удалить <a>...</a>
и <a><span>...</a></span>
конструкции.
Снова обновлено: В ответ на другой комментарий я обновил код, чтобы использовать фильтр get_the_excerpt
, так как это должно охватывать как явно заданные вырезки, так и вырезки, сгенерированные из содержимого поста.
add_filter( 'get_the_excerpt', 'wpse403907_strip_a_tags' );
/**
* Удаляет теги <a> из вырезки.
*
* @param string $excerpt Вырезка.
* @return string Отфильтрованная вырезка.
*/
function wpse403907_strip_a_tags( $excerpt ) {
$regex = array(
'|<a[^>]*>[^<]+</a>|',
'|<a[^>]*><span[^>]*>[^<]+</span></a>|'
);
$excerpt = preg_replace( $regex, '', $excerpt );
return $excerpt;
}
Добавьте вышеуказанный код в файл functions.php
вашей активной темы.
Регулярное выражение
Если вы не совсем понимаете, что делает регулярное выражение (первый параметр preg_replace()
, |<a[^>]*>[^<]+</a>|
), вот краткое объяснение:
|
– это разделитель (стандарт – использовать/
, но поскольку в строке, которую я ищу, есть/
, я использовал другой символ)<a[^>]*
ищет любую строку, начинающуюся с<a
и заканчивающуюся на>
, например,<a href="example.com" title="Это какой-то текст">
.[^<]+
ищет один или более символов, не являющихся<
, т.е. открывающего</a>
.</a>
соответствует концу тегаa
.|
– это конечный разделитель.
Обратите внимание, что если у вас есть какие-то вырезки с другими HTML тегами внутри <a>...</a>
, например, ...<a href="example.com">эта ссылка содержит <strong>жирный текст</strong>...</a>...
, это регулярное выражение не сработает корректно.
Ссылки
Ответ или решение
Чтобы игнорировать теги <a>
в экстрактах the_excerpt
в WordPress, существует несколько подходов с использованием фильтров и регулярных выражений. В данной статье мы рассмотрим пошаговое руководство по удалению ссылок из экстракта и приведем необходимые примеры кода.
Проблема
Ваша задача заключается в том, чтобы при выводе экстрактов страниц удалять все теги <a>
, которые могут содержать ссылки, оставляя остальной текст нетронутым. Это особенно актуально, если экстрат формируется из основного контента страницы, который по умолчанию не использует поле экскрета.
Решение
Использование фильтра get_the_excerpt
позволяет модифицировать экстракты перед их выводом на экран, что дает возможность совершенно удалить нежелательные <a>
теги.
Код решения
Для достижения этой цели добавьте следующий код в файл functions.php
вашей активной темы:
add_filter( 'get_the_excerpt', 'wpse403907_strip_a_tags' );
/**
* Удаляет теги <a> из экстракта.
*
* @param string $excerpt Экстракт.
* @return string Отфильтрованный экстракт.
*/
function wpse403907_strip_a_tags( $excerpt ) {
$regex = array(
'|<a[^>]*>.*?</a>|is', // Удаляет все теги <a> с их содержимым
'|<a[^>]*><span[^>]*>.*?</span></a>|is' // Удаляет специфические <a> теги с вложенными <span>`
);
$excerpt = preg_replace( $regex, '', $excerpt );
return $excerpt;
}
Объяснение регулярного выражения
-
|<a[^>]*>.*?</a>|is
– Это выражение удаляет любые теги<a>
, включая их содержимое:<a[^>]*>
соответствует открывающему тегу, учитывая возможные атрибуты..*?
захватывает все символы между открывающим и закрывающим тегами<a>
(нежадный режим).</a>
соответствует закрывающему тегу.- Флаги
i
(без учета регистра) иs
(выдаёт многострочное соответствие) используются для обеспечения гибкости.
-
Второе выражение |<a[^>]><span[^>]>.*?|is позволяет удалять ссылки, содержащие внутри себя тег
<span>
.
Подводя итог
Следуя приведенным рекомендациям, вы сможете успешно удалить теги <a>
из экстрактов в WordPress, не затрагивая остальные элементы контента. Исполнение этих простых шагов не только упростит управление содержимым, но и улучшит восприятие вашего сайта пользователями.
Полезные ссылки
- Документация WordPress о фильтрах
the_excerpt
- Документация WordPress о фильтрах
get_the_excerpt
- Информация о функции PHP
preg_replace
Эти ресурсы могут быть полезны для дальнейшего изучения и понимания работы с фильтрами в WordPress.