How to include line-breaks in the_excerpt?

how can I include a line-break inside the_excerpt. I’ve modified the length and the more-button via my functions.php. I’m using teaser for every blog-entry and sometimes it looks a bit ugly, that there no line-breaks included.

Related posts

Leave a Reply

5 comments

  1. There is no filter that would allow you to set allowable tags not to be removed by the_excerpt(). Arguably a shortcoming of the core.

    Anyhow, the actual excerpt generation does not happen in that template tag but entirely elsewhere:

    Excerpts are generated by the function wp_trim_excerpt(), inside of which the excerpt filters you are already using (excerpt_length and excerpt_more) are applied and which calls wp_trim_words(), which in turn calls upon wp_strip_all_tags(). All three functions are located in wp-includes/formatting.php

    Hence in the absence of a filter for the case and the inevitability of your excerpt running through wp_strip_all_tags(), the only possibility to preserve some tags is adding a custom replacement function for 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( "/[nrt ]+/", ' ', $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( "/[nrt ]+/", $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' );
    
  2. Same to Johannes Pille’s solution, the bellowing solution should be more adaptive.

    In detail:

    • override function wp_trim_excerpt
    • remove old filter and add new custom new filter

    Here’s full code:

    // append to themes/{your_theme}/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);
    
        // get through origin filter
        $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 default filter
    remove_filter('get_the_excerpt', 'wp_trim_excerpt');
    
    // add custom filter
    add_filter('get_the_excerpt', 'so306588_trim_excerpt_custom');
    
  3. wouldn’t it be simpler to apply the_content filter to the excerpt?

    i only use this occasionally, right within the template file:

    $excerpt = apply_filters('the_content',  ( get_post(get_the_ID())->post_excerpt) );
    echo $excerpt;
    
  4. At the moment, it is possible to use the_excerpt() funtion to display the excerpt with line breaks. But if you like to return the result you can use for that purpose a function like this:

    function get_the_excerpt_theme() {
        $excerpt = get_the_excerpt();
        $excerpt = apply_filters( 'the_excerpt', $excerpt );
        return $excerpt;
    }
    

    It applies a filters to the excerpt using apply_filters('the_excerpt', $excerpt ) like in the wp function the_excerpt() but returns the string without displaying it.

    Also, if you like to allow only line breaks in the excerpt, you can add $excerpt = strip_tags($excerpt,'<br>') below the line apply_filters.

    Hope it helps!