admin管理员组

文章数量:1319461

This question already has answers here: Allow HTML in excerpt (3 answers) Closed 4 years ago.

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() );
This question already has answers here: Allow HTML in excerpt (3 answers) Closed 4 years ago.

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( ']]>', ']]&gt;', $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() );
Share Improve this question edited Oct 7, 2020 at 12:58 Hector 6821 gold badge7 silver badges18 bronze badges asked Oct 3, 2020 at 16:35 mariomario 1215 bronze badges 1
  • Does this answer your question? Allow HTML in excerpt – admcfajn Commented Oct 14, 2020 at 23:16
Add a comment  | 

1 Answer 1

Reset to default 0

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');

本文标签: How to display links in excerpt