I’m building a theme that is going to show excerpts on the homepage for potentially dozens of posts. I don’t have manual excerpts on all of my posts, so $post->post_excerpt
is empty for many posts. In the event that there isn’t a manual excerpt, I would like to use the built-in get_the_excerpt() function, but it isn’t available outside the loop.
Tracking down the function, it looks like it uses wp_trim_excerpt from wp-includes/formatting.php to create excerpts on the fly. I am calling it in my code like wp_trim_excerpt( $item->post_content )
, but it is simply returning the full content. Am I doing something wrong?
I know that I can create my own function to create an excerpt, but I like to use built-in functions where possible, keeping my code compatible with other potential plugins / filters.
http://adambrown.info/p/wp_hooks/hook/wp_trim_excerpt?version=3.0&file=wp-includes/formatting.php
Since WP 3.3.0,
wp_trim_words()
is helpful if you’re able to get the content that you want to generate an excerpt for. Hope that’s helpful to someone and it saves creating your own word counting function.http://codex.wordpress.org/Function_Reference/wp_trim_words
wp_trim_excerpt()
has a little curious mechanics – if anything is passed to it then it does nothing.Here is basic logic behind it:
get_the_excerpt()
checks for manual excerpt;wp_trim_excerpt()
chimes in if there is no manual excerpt and makes one from content or teaser.Both are tightly tied to global variables and so Loop.
Outside the Loop you are better of taking code out of
wp_trim_excerpt()
and writing your own trim function.Update:
Here is a derivative of wp_trim_excerpt() which I used. Works perfectly. Derived from WordPress version 3.0.4
Here’s my take on a “trim_excerpt” that takes the post object or a post ID as a parameter.
Obviously based on what’s in core. Don’t know why this (and get_the_author()) don’t have non-loop equivalents.
+1 to Rast. It is very weird that there is no such thing as get_the_excerpt($post->ID), when it should be quite obvious that it should. Anyway, here is wp_trim_excerpt() in wordpress version 3.0.4:
http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php
You can see on line 1826 that it is linked to the $post global variable via get_the_contents. And yes, I have no idea what were they thinking. But from here, replace the get_the_content with $text in your own my_excerpt, and it should behave in a similar fashion.
The get_the_content() function would return full content if $more != 0.
You have to set global variable $more to 0 to make sure get_the_content() function return excerpt.
Modified wp_trim_excerpt() function:
Using others’ answers above, here’s a simpler answer that seems to work well:
I’m using it in the
<meta>
tags in a function to define OpenGraph descriptions. So then I just add: