I feel like I must be missing something pretty obvious, here, but I can't seem to get WordPress to cooperate.

I'm generating Facebook OG tags with a function. Everything works fine, except for the excerpt.

Since the deprecation of get_the_excerpt($post->ID), is there another way to create an excerpt without having to create a whole new loop? It seems excessive to me.

My first instinct was to use apply_filters():

$description = apply_filters('the_excerpt', get_post($post->ID)->post_content);

That gives me the full post, complete with HTML-formatted content. Okay, must be wrong. So I tried the next logical idea:

$description = apply_filters('get_the_excerpt', get_post($post->ID)->post_content);

No dice. Now there's no HTML, but it's still the full post (which is really confusing).

Okay, no problem. Let's skip all the fancy stuff and just go for the trimmed entry:

$description = wp_trim_excerpt(get_post($post->ID)->post_content);

No change.

So, my question is this: what the heck is going on? Is there something I'm missing, here?

I got into the WP core to find how the_excerpt() works, and it appears to be identical to my call:

 * Display the post excerpt.
 * @since 0.71
 * @uses apply_filters() Calls 'the_excerpt' hook on post excerpt.
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());

I have a few questions based on my findings:

  1. Why isn't the filter applying as expected?
  2. Is there a way to get the excerpt outside of the loop without creating a new loop?
  3. Am I crazy?

Thanks in advance for having a look. I'm fairly stumped, here.

  • get_the_excerpt() isn't deprecated, just the extra param that used to be passed to it is no longer used.
    – Milo
    Dec 31, 2011 at 17:47
  • Sorry, that's what I meant. Thanks for clarifying.
    – jlengstorf
    Dec 31, 2011 at 18:55
  • You are crazy! . . . as am I lol Oct 7, 2016 at 8:15

3 Answers 3


Turns out the answer was in wp_trim_excerpt().

It's defined in wp-includes/functions.php:1879:

 * Generates an excerpt from the content, if needed.
 * The excerpt word amount will be 55 words and if the amount is greater than
 * that, then the string ' [...]' will be appended to the excerpt. If the string
 * is less than 55 words, then the content will be returned as is.
 * The 55 word limit can be modified by plugins/themes using the excerpt_length filter
 * The ' [...]' string can be modified by plugins/themes using the excerpt_more filter
 * @since 1.5.0
 * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
 * @return string The excerpt.
function 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', ' ' . '[...]');
        $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);

So any text passed in doesn't get processed; it only works if it's called with an empty parameter.

To solve this, I added a quick filter to my theme that solves the problem:

 * Allows for excerpt generation outside the loop.
 * @param string $text  The text to be trimmed
 * @return string       The trimmed text
function rw_trim_excerpt( $text='' )
    $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', ' ' . '[...]');
    return wp_trim_words( $text, $excerpt_length, $excerpt_more );
add_filter('wp_trim_excerpt', 'rw_trim_excerpt');

It's somewhat redundant, but I like it better than opening new loops every time I want to generate an excerpt.

  • 1
    Ah, it was not clear to me you're looking for the text operation only (not fetching from DB).
    – hakre
    Jan 2, 2012 at 8:08
  • No worries. I always fear I'm not making sense when I ask questions. I was pulling from the database, but I didn't want to open a whole 'nother loop since I have things like get_the_title($post->ID) available. The final line of code was $description = wp_trim_excerpt(get_post($post->ID)->post_content);
    – jlengstorf
    Jan 2, 2012 at 19:56
  • I feel really stupid asking this, but how do you call this new filter? I tried it as $content = apply_filters( 'rw_trim_excerpt', $content ); and $content = rw_trim_excerpt($content);, but neither of these worked (former didn't trim the output and the later produced an error).
    – Eric K
    Aug 26, 2015 at 16:33
  • 3
    @QuantumDynamix This is designed to modify the get_the_excerpt handling to mimic the_excerpt, so you can call: apply_filters('get_the_excerpt', $content);.
    – jlengstorf
    Sep 1, 2015 at 17:07
  • phew! nice one from a wpress noob's point of view, thanks Oct 7, 2016 at 8:45



See: get_post­Codex for all available return members.

  • 4
    That returns blank if no excerpt was entered for the post. I need to mimic the actions of get_the_excerpt() (creating an excerpt if none exists).
    – jlengstorf
    Dec 31, 2011 at 19:00
  • Applying the filter won't do that, so you're asking the wrong question. No idea why you're looking for an excerpt if there isn't any. get_the_excerpt() does not mimic that, check the source, it's only accessing the member variable of $post which is post_excerpt. See also the codex link in the answer.
    – hakre
    Dec 31, 2011 at 19:11
  • 3
    From the Codex entry on the_excerpt: "it will display an automatic excerpt which refers to the first 55 words of the post's content." I'm looking to mimic that behavior outside of the loop.
    – jlengstorf
    Dec 31, 2011 at 20:14
  • Well create a second loop temporarily and query that file by it's id then probably for a quick solution. See Secondary Loops - codex.wordpress.org/Function_Reference/…
    – hakre
    Dec 31, 2011 at 22:07
  • 1
    Thanks for the link. I knew I could set up an additional loop, but it seems like overkill. My solution was adding a filter. I see it as a little elbow grease now for a lot less code later.
    – jlengstorf
    Jan 1, 2012 at 18:14

You can use my custom function to filte the content (it's from NARGA Framework)

  • If the post has custom excerpt, display it instead the content
  • Auto generate excerpt from the conten if the post hasn't custom cerpt
  • Auto trim shortcode, HTML code, remove [...], add "Read More" text (translatable)

        * Auto generate excerpt from content if the post hasn't custom excerpt
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  The maximium words of excerpt generating from content
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        function narga_excerpts($content = false) {
        # If is the home page, an archive, or search results
        if(is_front_page() || is_archive() || is_search()) :
            global $post;
        $content = $post->post_excerpt;
        $content = strip_shortcodes($content);
        $content = str_replace(']]>', ']]>', $content);
        $content = strip_tags($content);
        # If an excerpt is set in the Optional Excerpt box
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # If no excerpt is set
        else :
            $content = $post->post_content;
            $excerpt_length = 50;
            $words = explode(' ', $content, $excerpt_length + 1);
        if(count($words) > $excerpt_length) :
            array_push($words, '...<p><a class="more-link" href="' . get_permalink() . '" title="' . the_title_attribute('echo=0') . '">  ' . __( 'Read more &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        $content = '<p>' . $content . '</p>';
        # Make sure to return the content
        return $content;
        // Add filter to the_content
        add_filter('the_content', 'narga_excerpts');

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.