WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Why is it that one cannot get the excerpt by ID like with the title and most other elements.

eg. get_the_excerpt(ID). I know how to use it with the $post->post_excerpt function but that does not return part of the content if no excerpt was entered it simple returns nothing.

So what I am trying to do is get the excerpt by ID if there is an excerpt, and if there isn't an excerpt with that ID but there is some content, to get some of the content instead.

How would one do that.

Any ideas,

Marvellous ...


Loop Source Code as Requested.

<?php $stories = get_posts('category_name=feedback&numberposts=4'); 
            foreach ($stories as $post) :
            $title = $post->post_title;
            $excerpt = get_the_excerpt_id($post->ID);
            $thumb = get_the_post_thumbnail($post->ID,array(60, 60, true));?>
              <div class="textstandard_white" style="font-size:14px; line-height:22px; padding-top:10px;"><b><a href="<?php echo get_permalink($post->ID);?>"><?php echo $title;?></a></b></div><div align="left" style="height:18px; width:82px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars.png) left top no-repeat;"><div id="stars<?php echo $post->ID;?>" align="left" style="height:18px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars_glow.png) left top no-repeat;">

                  <script type="text/javascript">
                var width<?php echo $post->ID;?> = ((<?php
$Rating = get_post_meta($post->ID, "Rating", true);
echo $Rating;
?> * 20) + '%')
                  $('#stars<?php echo $post->ID;?>').css('width', width<?php echo $post->ID;?>);

                 </script><div class="textstandard_white" style="padding-top:6px; font-size:10px; color:#BBB; padding-bottom:10px; border-bottom:1px dotted #BBB; min-height:70px;"><div style="float:left; padding-right:6px; padding-bottom:6px;"><div style="background:#FFF; border:1px solid #FFF;
border-radius: 4px; -moz-border-radius: 4px ; -webkit-border-radius: 4px; padding:4px;"><a href="<?php echo get_permalink($post->ID);?>"><?php echo $thumb;?></a></div></div>

<?php echo $excerpt;?></div>
              <?php endforeach;?>
share|improve this question
what exactly is "some" of the content? – kaiser Mar 19 '11 at 17:47
The excerpt function in wordpress returns the excerpt of a post. If the post does not have an excerpt it returns a certain number of characters of the content followed by '...' or 'read more' or whatever the template provides – Robin I Knight Mar 19 '11 at 17:48
Not to be a PITA but community rules disallow signatures and standard closings. So as to abide by the rules and avoid having Jeff Atwood send you a stern message after editing all your questions, please stop using "Marvellous" as a closing. (And please don't shoot the messenger) – MikeSchinkel Mar 19 '11 at 18:26
up vote 11 down vote accepted

Hi @Robin I. Knight:

I view get_the_excerpt() as a function with legacy design. As WordPress usage has grown there are many newer use-cases where it doesn't fit but where the newer functions for getting different data do. One example is the now frequent use of an $args array of function options.

But it's easy to fix for your needs. Here's an alternative function you can use which you can put anywhere in your theme's functions.php file:

function robins_get_the_excerpt($post_id) {
  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;

I've not tested it but am pretty sure I got it right. If this doesn't meet your needs please elaborate and maybe I can make other suggestions.

share|improve this answer
It works. Sort of. Very odd results. It is definitely performing its function but the results are odd. I am using it in conjunction with GET_Posts and for some reason the top 2 get posts are always the same. Here is a link and you will see what I mean. Look at the 4 posts on the right hand side. divethegap.com/update/community/feedback/2010/06/steve-riches – Robin I Knight Mar 19 '11 at 19:48
@Robin I Knight: Please post your loop source code as an update to your question; it's very hard to debug code without seeing code. It's also possibly a plugin that is causing the problem; try disabling them one at a time. – MikeSchinkel Mar 19 '11 at 20:19
Loop source code in question above ^^ – Robin I Knight Mar 19 '11 at 20:28
BTW I changed the name of the function to get_the_excerpt_id($post_id) – Robin I Knight Mar 20 '11 at 15:11
@Robin I Knight - I don't see anything in your loop, but you might try calling setup_postdata($post) at the beginning of your loop, as @Rarst suggests. If that doesn't work it might be a plugin you need to disable; have you tried that? And you probably don't want to call it get_the_excerpt_id() because WordPress could add that function in the future and break your site. And you could probably do without the function in your loop by using foreach($stories as $story): global $post; $post = $story; instead. – MikeSchinkel Mar 20 '11 at 19:54

The mechanics of excerpt are extremely confusing. It is not precise answer to your question but in general if you need to make template tags, specific to Loop, work with array returned by get_posts() you can emulate Loop like this:

$stories = get_posts(); 

foreach ($stories as $post) {


    // stuff
share|improve this answer
what about wp_reset_query(); ? – cwd Jan 27 '12 at 16:39
@cwd if only using setup_postdata() global query is not affected and only post data needs to be reset. – Rarst Jan 27 '12 at 18:47
This solution is allot cleaner than storing the post in another var and requering another post just to get it global. +1 – Barry Kooij Apr 10 '13 at 16:02
Thanks @Rarst that helped me out. Adding setup_postdata($post); resolved my issues – Simon Nov 14 '14 at 20:55

There is a new function since 3.3.0: wp_trim_words

I'm using it outside the loop as follows:

 <?php if ( $post_id ) {
 $post = get_post( $post_id );
 if ( $post ) { ?>
     <h2><?php echo $post->post_title; ?></h2>
     <p><em><?php echo wp_trim_words( $post->post_content ); ?></em></p>
     <p><strong>This article can only be read by subscribers.</strong></p>
 <?php } } ?>

This is not to be confused with wp_trim_excerpt that apparently only works within the loop, since it calls the_content() internally.

share|improve this answer

Just to add to MikeSchinkel's answer, which for some reason wouldn't work for me. I had to add the setup_postdata line to make it work.

function get_the_excerpt( $post_id ){

  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  setup_postdata( $post ); // hello
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;


I'm assuming if you're using this outside the loop then it shouldn't interfere with other setup_postdata going on.


share|improve this answer

If ALL your posts have the <!--more--> tag, then you can use the following with your code above:

$sjc_excerpt = explode( '<!--more-->', $post->post_content); 
echo wpautop( $sjc_excerpt[0] );

Of course if you have any posts that don't have the <!--more--> tag, they'll be shown in their entirety. Works in my situation, but not for all...

share|improve this answer

Building on @Maxime's answer, would this work?

$post = get_post( $id );

$excerpt = ( $post->post_excerpt ) ? $post->post_excerpt : $post->post_content;

It seems straight forward enough to me, but I'm wondering if I'm missing something.

share|improve this answer

This is faster:

global $post;
return get_post($post_id)->post_excerpt;
share|improve this answer
Not when the excerpt is empty … as mentioned in the question. – toscho Nov 12 '12 at 12:22
Indeed not when an except is automatically generated – Joshc Jan 15 '14 at 14:33

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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