Как добавить переносы строк в the_excerpt?

8 окт. 2012 г., 17:01:34
Просмотры: 21.3K
Голосов: 10

Как я могу добавить перенос строки внутри the_excerpt? Я уже изменил длину и кнопку "читать далее" через functions.php. Я использую тизеры для каждой записи блога, и иногда они выглядят некрасиво из-за отсутствия переносов строк.

0
Все ответы на вопрос 6
2

Аналогично решению Johannes Pille, представленное ниже решение должно быть более адаптивным.

Подробности:

  • переопределение функции wp_trim_excerpt
  • удаление старого фильтра и добавление нового пользовательского фильтра

Полный код:

// добавить в themes/{ваша_тема}/functions.php

define('EXCERPT_RARELY', '{[}]');
define('EXCERPT_BR', nl2br(PHP_EOL));

function so306588_trim_excerpt_custom($text = '')
{
    add_filter('the_content', 'so306588_trim_excerpt_custom_mark', 6);

    // пропустить через оригинальный фильтр
    $text = wp_trim_excerpt($text);

    remove_filter('the_content', 'so306588_trim_excerpt_custom_mark', 6);

    return so306588_trim_excerpt_custom_restore($text);
}

function so306588_trim_excerpt_custom_mark($text)
{
    $text = nl2br($text);
    return str_replace(EXCERPT_BR, EXCERPT_RARELY, $text);
}

function so306588_trim_excerpt_custom_restore($text)
{
    return str_replace(EXCERPT_RARELY, EXCERPT_BR, $text);
}

// удалить стандартный фильтр
remove_filter('get_the_excerpt', 'wp_trim_excerpt');

// добавить пользовательский фильтр
add_filter('get_the_excerpt', 'so306588_trim_excerpt_custom');
21 июн. 2018 г. 10:02:11
Комментарии

Мне нравится. +1. Если бы автор вопроса когда-либо принимал мой ответ, я бы написал: "Это должен быть принятый ответ (сейчас)".

Johannes Pille Johannes Pille
2 июл. 2018 г. 20:50:57

Работало идеально, пока несколько дней назад не перестало... Но я пока не смог точно определить причину ошибки. Однако, поскольку @Nitzki оставил похожий комментарий к решению Johannes, предполагаю, что WordPress что-то изменил в последнем обновлении, что сломало функциональность...

user3696412 user3696412
29 окт. 2020 г. 18:10:23
2

В WordPress нет фильтра, который позволял бы задавать разрешённые теги, чтобы они не удалялись функцией the_excerpt(). Можно считать это недоработкой ядра.

В любом случае, фактическое формирование цитат происходит не в этом шаблонном теге, а совсем в другом месте:

Цитаты генерируются функцией wp_trim_excerpt(), внутри которой применяются уже используемые вами фильтры цитат (excerpt_length и excerpt_more), и которая вызывает wp_trim_words(), а та, в свою очередь, обращается к wp_strip_all_tags(). Все три функции находятся в файле wp-includes/formatting.php.

Таким образом, в отсутствие фильтра для данного случая и неизбежности прохождения вашей цитаты через wp_strip_all_tags(), единственная возможность сохранить некоторые теги — это добавить пользовательскую функцию-заменитель для wp_trim_excerpt():

function wpse67498_wp_trim_excerpt( $text = '' ) {
    $raw_excerpt = $text;

    if ( '' == $text ) {
        $text = get_the_content( '' );
        $text = strip_shortcodes( $text );
        $text = apply_filters( 'the_content', $text );
        $text = str_replace( ']]>', ']]>', $text );
        $excerpt_length = apply_filters( 'excerpt_length', 55 );
        $excerpt_more = apply_filters( 'excerpt_more', ' ' . '[...]' );

        $allowable = '<br>';
        $text = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $text );
        $text = trim( strip_tags( $text, $allowable ) );

        if ( 'characters' == _x( 'words', 'word count: words or characters?' )
            && preg_match( '/^utf\-?8$/i', get_option( 'blog_charset' ) ) )
        {
            $text = trim( preg_replace( "/[\n\r\t ]+/", ' ', $text ), ' ' );
            preg_match_all( '/./u', $text, $words_array );
            $words_array = array_slice( $words_array[0], 0, $num_words + 1 );
            $sep = '';
        } else {
            $words_array = preg_split( "/[\n\r\t ]+/", $text, $num_words + 1, PREG_SPLIT_NO_EMPTY );
            $sep = ' ';
        }

        if ( count( $words_array ) > $excerpt_length ) {
            array_pop( $words_array );
            $text = implode( $sep, $words_array );
            $text = $text . $excerpt_more;
        } else {
            $text = implode( $sep, $words_array );
        }
    }

    return apply_filters( 'wp_trim_excerpt', $text, $raw_excerpt );
}

remove_filter( 'get_the_excerpt', 'wp_trim_excerpt');
add_filter( 'get_the_excerpt', 'wpse67498_wp_trim_excerpt' );
8 окт. 2012 г. 18:07:02
Комментарии

Хорошо, спасибо. Но теперь кажется, что я не могу сократить отрывок до 20 слов и добавить кнопку "подробнее" вместо [...]

Nitzki Nitzki
8 окт. 2012 г. 19:03:25

Так как же теперь я могу редактировать excerpt_length и excerpt_more? Это больше не работает.

Nitzki Nitzki
9 окт. 2012 г. 13:45:20
2

не проще ли применить фильтр the_content к отрывку?

я использую это лишь изредка, прямо в файле шаблона:

$excerpt = apply_filters('the_content',  ( get_post(get_the_ID())->post_excerpt) );
echo $excerpt;
9 апр. 2020 г. 20:50:35
Комментарии

Блестяще! Это сработало для меня

A. D'Alfonso A. D'Alfonso
30 мар. 2021 г. 12:57:31

Похоже, это именно то, что мне нужно. Но куда в шаблоне это нужно вставить, @diette? Спасибо!

DWright DWright
21 янв. 2023 г. 19:33:23
1

В данный момент можно использовать функцию the_excerpt() для вывода отрывка с переносами строк. Но если вам нужно вернуть результат, а не выводить его напрямую, можно воспользоваться такой функцией:

function get_the_excerpt_theme() {
    $excerpt = get_the_excerpt(); // Получаем отрывок
    $excerpt = apply_filters( 'the_excerpt', $excerpt ); // Применяем фильтры, как в функции the_excerpt()
    return $excerpt; // Возвращаем отрывок
}

Она применяет фильтры к отрывку через apply_filters('the_excerpt', $excerpt ), как в функции WordPress the_excerpt(), но возвращает строку вместо её вывода.

Также, если вам нужно разрешить только переносы строк в отрывке, вы можете добавить $excerpt = strip_tags($excerpt,'<br>') после строки с apply_filters.

Надеюсь, это поможет!

22 сент. 2016 г. 14:30:13
Комментарии

Это не работает, так как не допускает разрывы строк.

Jason Axelson Jason Axelson
3 мар. 2022 г. 11:14:41
0

Простое решение — заменить переносы строк до того, как WordPress их обработает. Я использовал произвольно выбранный символ из частной зоны Unicode, так как он вряд ли встретится в контенте, а если и появится, то эта зона предназначена для частного использования, что означает нестандартную обработку.

add_filter('wp_trim_words', function($text, $num_words, $more, $original_text) {
    static $filtering;
    if ( $filtering ) {
        return $text;
    }
    $filtering = true;
    
    // Случайный символ из частной зоны Unicode
    $private_use_char = "\u{101425}";
    
    $text = str_replace( ["\n\r", "\n", "\r"], $private_use_char, $original_text);
    $text = wp_trim_words($text, $num_words, $more);
    $text = str_replace($private_use_char, "\n", $text); // или str_replace($private_use_char, "<br>", $text)
    
    $filtering = false;
    return $text;
}, 10, 4);

Обратите внимание, что это приведёт к появлению символов "\n" в выводе функций the_excerpt() и get_the_excerpt(), поэтому, вероятно, перед использованием в HTML стоит применить wpautop(). Альтернативно можно просто заменить $private_use_char на <br> вместо \n, как указано в комментарии.

27 мар. 2024 г. 13:35:20
3
-1

также можно использовать функцию nl2br() в PHP:

echo nl2br(get_the_excerpt());

-- или --

nl2br(the_excerpt());
16 окт. 2017 г. 11:13:31
Комментарии

Это не работает.

Bence Szalai Bence Szalai
15 дек. 2020 г. 22:16:05

Похоже, в последней версии WordPress поле excerpt обрабатывается как обычное поле содержимого записи.. Я проверил это на SandboxWordpress.com и теперь новые строки возвращаются как отдельные теги параграфа. Хотя уверен, что раньше это работало, иначе я бы не делился этим решением. Не думаю, что минус был необходим, но рад, что это привлекло мое внимание.

mroncetwice mroncetwice
18 дек. 2020 г. 04:57:06

Я могу убрать минус, хотя не уверен, как это правильно сделать, потому что, несмотря на то, что это могло работать раньше, сейчас это не работает, и я почувствовал, что потратил время зря. С другой стороны, конечно, ни один ответ не может оставаться актуальным вечно, когда система меняется. Так как же правильно указать, что ответ больше не полезен, даже если когда-то был? Я открыт для предложений. Пожалуйста, добавьте примечание в ответ, что он больше не работает в последней версии WP, и я уберу минус. Договорились?

Bence Szalai Bence Szalai
18 дек. 2020 г. 13:56:15