How to display links in excerpt? [duplicate]

I am not able to see how to display links within excerpts.

A number of posts suggest to try something along the following lines, but I am not able to render links within excerpts. What do I miss?

Within functions.php of my theme I define:

function improved_trim_excerpt( $text="", $post = null ) {
$raw_excerpt = $text;

if ( '' === trim( $text ) ) {
    $post = get_post( $post );
    $text =  get_the_content( '', false, $post );
    $text = strip_shortcodes( $text );
    $text = excerpt_remove_blocks( $text );

    /** This filter is documented in wp-includes/post-template.php */
    $text = apply_filters( 'the_content', $text );
    $text = str_replace( ']]>', ']]>', $text );
    
    $text = preg_replace('@<script[^>]*?>.*?</script>@si', '', $text);
    $text = strip_tags($text, '<p>');   // to keep par
    $text = strip_tags($text, '<a>');   // to keep links

    /* translators: Maximum number of words used in a post excerpt. */
    $excerpt_length = intval( _x( '55', 'excerpt_length' ) );

    /**
     * Filters the maximum number of words in a post excerpt.
     *
     * @since 2.7.0
     *
     * @param int $number The maximum number of words. Default 55.
     */
    $excerpt_length = (int) apply_filters( 'excerpt_length', $excerpt_length );

    /**
     * Filters the string in the "more" link displayed after a trimmed excerpt.
     *
     * @since 2.9.0
     *
     * @param string $more_string The string shown within the more link.
     */
    $excerpt_more = apply_filters( 'excerpt_more', ' ' . '[&hellip;]' );
    $text         = wp_trim_words( $text, $excerpt_length, $excerpt_more );
}

/**
 * Filters the trimmed excerpt string.
 *
 * @since 2.8.0
 *
 * @param string $text        The trimmed text.
 * @param string $raw_excerpt The text prior to trimming.
 */
return apply_filters( 'improved_trim_excerpt', $text, $raw_excerpt );
}

and I add the following lines within my content.php

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'improved_trim_excerpt');
$main_content = apply_filters( 'the_content', get_the_excerpt() );

1 Answer
1

First, I would suggest that you combine your p and a tags into one line, like so:

$text = strip_tags($text, '<p><a>'); 

Second, the remove_filter and add_filter should go in your functions.php file, not content.php…..move those lines to just below the $text = strip_tags…..

I don’t think you need the line that has $main_content = apply_filters as I’ve never seen that used before. Try it without it and after moving the other two lines, but if you find you need it then it would also go in your functions.php file.

EDITED: Here is my entire code, in case it helps anyone else. This works perfectly to preserve bolding ( and ), italics ( and ) and links (). Those are the only tags I allow in my excerpts but that can be modified to suit your needs. THIS goes in my Child Theme’s functions.php file so it’s safe from Theme updates.

    // Improves the look of the excerpt, more words, allows bolding
function improved_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('\]\]\>', ']]&gt;', $text);
    $text = strip_tags($text, '<b><strong><em><i><a>');
    $excerpt_length = apply_filters('excerpt_length', 45);
    $newexcerpt_more = apply_filters('excerpt_more', 'new_excerpt_more');
    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
    if ( count($words) > $excerpt_length ) {
        array_pop($words);
        $text = implode(' ', $words);
        $text = $text . $newexcerpt_more;
        $text = force_balance_tags( $text );
    } else {
        $text = implode(' ', $words);
        $text = force_balance_tags( $text );
    }
}
return $text;
}
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'improved_trim_excerpt');

Leave a Comment