Игнорирование ссылок из the_excerpt

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

Я ищу способ игнорировать любые <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;
}

Объяснение регулярного выражения

  1. |<a[^>]*>.*?</a>|is – Это выражение удаляет любые теги <a>, включая их содержимое:

    • <a[^>]*> соответствует открывающему тегу, учитывая возможные атрибуты.
    • .*? захватывает все символы между открывающим и закрывающим тегами <a> (нежадный режим).
    • </a> соответствует закрывающему тегу.
    • Флаги i (без учета регистра) и s (выдаёт многострочное соответствие) используются для обеспечения гибкости.
  2. Второе выражение |<a[^>]><span[^>]>.*?|is позволяет удалять ссылки, содержащие внутри себя тег <span>.

Подводя итог

Следуя приведенным рекомендациям, вы сможете успешно удалить теги <a> из экстрактов в WordPress, не затрагивая остальные элементы контента. Исполнение этих простых шагов не только упростит управление содержимым, но и улучшит восприятие вашего сайта пользователями.

Полезные ссылки

Эти ресурсы могут быть полезны для дальнейшего изучения и понимания работы с фильтрами в WordPress.

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

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