Ограничьте статью 100 символами. Нельзя использовать the_excerpt…

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

Я долго с этим борюсь… Я хочу ограничить длину статьи до 100 символов, и после этого лимита добавить в конце ‘…’ с ссылкой на отдельный пост (как в WordPress <!--more-->). Но я не могу использовать the_excerpt, потому что он удаляет форматирование (например, теги <b>, <a>). Может кто-то помочь мне с этим?

function get_custom_excerpt( $content, $link ){

   $content = some_function_to_handle_html_tag(substr($content, 0, 100)); // ИЗМЕНИТЕ: надо настроить с помощью regex для правильного вывода
   $content .= ' <a href="'.$link.'"> ещё... </a>';

   return $content;
}

function some_function_to_handle_html_tag(){
    //regex для проверки последнего вхождения открывающего html тега
    //добавить соответствующий закрывающий тег или удалить тег, если он сломан, например, '<' или '<что-то'
}
//для глобального $post
echo get_custom_excerpt($post->post_content, get_permalink($post->ID)); //напечатать пользовательскую аннотацию из 100 символов

или

//в цикле
echo get_custom_excerpt(get_the_content(), get_permalink(get_the_ID())); //напечатать пользовательскую аннотацию из 100 символов

ИЗМЕНЕНИЕ:

Это может быть нестабильно, если какой-либо html тег был открыт в первых 100 символах, но не закрыт. Я пытался найти правильное решение (показывать контент без удаления html), но ничего полезного не нашел. Но у меня есть идея, которая может помочь –

1) Вы можете использовать regex, который проверит последнее вхождение строки, начинающейся с < и заканчивающейся на >, после чего вам нужно будет добавить соответствующий закрывающий тег в конце. Например, если есть тег <span>, то </span> нужно будет добавить в конце, чтобы предотвратить сбой html-разметки.

2) Если появляется любое вхождение, например, < или <что-то, то это должно быть удалено.

Тогда приведенный выше код должен работать в большинстве случаев.

Ответ или решение

Для решения вашей задачи по ограничению длины статьи до 100 символов с сохранением форматирования HTML, можно использовать следующую реализацию. Мы создадим кастомную функцию get_custom_excerpt, которая будет управлять обработкой текста. Функция будет учитывать открытые теги и корректно добавлять закрывающие теги, если они необходимы.

Вот пример кода:

function get_custom_excerpt($content, $link) {
    // Обрезаем контент до 100 символов
    $truncated_content = mb_substr($content, 0, 100);

    // Находим последний открытый HTML тег
    $open_tags = [];
    preg_match_all('/<([a-zA-Z]+)(?:\s[^>]*)?>/', $truncated_content, $open_tags);
    $open_tags = array_reverse($open_tags[1]);

    // Находим закрытые теги, чтобы сбалансировать их
    foreach ($open_tags as $tag) {
        if (!in_array($tag, ['br', 'img', 'hr'])) {
            $truncated_content .= '</' . $tag . '>';
        }
    }

    // Добавляем ссылку 'больше...'
    $truncated_content .= ' <a href="' . esc_url($link) . '">больше...</a>';

    return $truncated_content;
}

// Вызов функции
echo get_custom_excerpt(get_the_content(), get_permalink(get_the_ID()));

Объяснение кода:

  1. Обрезка строки: Используем mb_substr для корректной обрезки строки, сохраняя символы UTF-8.
  2. Обработка тегов: Используем регулярные выражения для поиска открытых тегов и добавления закрывающих на основе последних открытых тегов.
  3. Согласование тегов: Мы добавляем закрывающие теги только для тех, которые не являются самозакрывающимися (например, <br>, <img>, <hr>).
  4. Ссылка на продолжение: В конце добавляется гиперссылка для перехода к полной версии записи.

Важные моменты:

  • Безопасность: Используйте esc_url() для защиты от XSS-атак при выводе ссылки.
  • Проблемы с HTML: Эта реализация предполагает, что на первых 100 символах текста корректно открываются теги. Если тег открыт, но не закрыт, будут добавлены соответствующие закрывающие теги.

Этот подход позволит вам сохранять форматирование HTML при обрезке текста, что важно для поддержания эстетики ваших материалов.

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

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