Using The New Post Thumbnail Feature In WordPress 2.9

Wordpress Logo by kremaliciousWordPress 2.9 added a new feature which allows you to assign an image to an article to make it the post image like it’s often used in magazine style themes. This new feature along with a new template tag makes all the custom field hacks usually used for this functionality in the past obsolete. So here’s a quick walkthrough to make use of the new post thumbnail feature and of course how to make it backwards compatible.

1. Activate The Feature

Add WordPress Post Thumbnail Support To ThemeFor whatever reason you first have to activate the feature with an entry in your theme’s functions.php file in order to get the Post Thumbnail box in the Editor.

So just open up your theme’s functions.php file in your favorite editor or create it if there’s no such file in your theme folder. Add this little code snippet to this file:

add_theme_support('post-thumbnails');

For backwards compatibility you should wrap this inside a function check for the new add_theme_support:

if ( function_exists( 'add_theme_support' ) ) 
  add_theme_support( 'post-thumbnails' );

This makes sure WordPress installation prior to 2.9 won’t get screwed up when using a theme with this new feature.

2. Add A Post Thumbnail To Your Post

Add Post ThumbnailAfter you’ve added the above mentioned code into your functions.php file there should be a new Post Thumbnail box in the WordPress editor view on the right side.

In this box click on the Set Thumbnail link and the usual Add Media dialogue will pop up where you can choose an image from your Media Library. At the end of the dialogue for the selected image there’s a new link beside the Insert into Post button called Use as thumbnail.

Add Post Thumbnail 2Click this and your chosen image will be assigned as the post thumbnail. (Unfortunately the Use as thumbnail link is missing in the dialogue which appears after uploading an image, it’s just there if you browse your Media Library.)

You can close the media dialogue now and you will see the image in the Post Thumbnail box:

Post Thumbnail added

3. Display The Post Thumbnail In Your Theme

Add to themeBasically all you have to do is to add this new template tag in your theme files where you want to display the post thumbnail, most certainly in your index.php file:

<?php the_post_thumbnail(); ?>

This template tag will display the thumbnail sized post thumbnail by default and is essentially the same as:

<?php the_post_thumbnail('thumbnail'); ?>

But of course you can grab the other sizes WordPress automatically creates when you upload an image:

<?php 
  the_post_thumbnail('medium'); 
  the_post_thumbnail('large'); 
?>

(Note: Matt left a comment on WP Engineer stating he wouldn’t recommend using these named arguments but provided no explanation for it yet.)

The code will output a generic <img /> tag with a class of wp-post-image. Needless to say this is what you can select with css to style just the post thumbnails further:

.wp-post-image { border: 2px solid #ccc; } 

Custom Output

If you want to adjust the generated output of the <img /> tag you can do this by using some array stuff. So let’s say you want to have the post thumbnails to be 200x200px big and another class assigned to it, you can extend the template tag like so:

<?php the_post_thumbnail(array( 200,200 ), array( 'class' => 'alignleft' )); ?>

If you want to add more than one class you can do this like so:

<?php the_post_thumbnail('medium', array('class' => 'alignleft another_class')); ?>

And you can add any attributes to the <img /> tag like a title, rel or an alt attribute. For accessibility reasons you should always add at least the alt-attribute:

<?php the_post_thumbnail('medium', array('class' => 'alignleft', 'alt' => 'alttext')); ?>

As for the title attribute this will be grabbed automatically from the entry you’ve made in your Media Library during the upload process but you even could override this too:

<?php the_post_thumbnail('medium', array('class' => 'alignleft', 'alt' => 'alttext', 'title' => 'titletext')); ?>

Respect Media Settings

Finally if you want to respect the custom sizes you or your users have set under Settings > Media you can first grab those sizes with get_option function and then put it in the array:

<?php 
  $width = get_option('thumbnail_size_w');  // get the width of the thumbnail setting
  $height = get_option('thumbnail_size_h'); // get the height of the thumbnail setting
  the_post_thumbnail(array($width, $height), array('class' => 'alignleft')); 
?>

You can also detect the Media settings for the other sizes and whether the crop setting is active or not:

<?php 
  get_option('medium_size_w');  // Width of the medium size
  get_option('medium_size_h');  // Height of the medium size
  get_option('large_size_w');   // Width of the large size
  get_option('large_size_h');   // Height of the large size
  get_option('thumbnail_crop'); // Check for crop, On=1, Off=0 
?>

4. Make It Bulletproof (a.k.a. Backwards Compatible)

With the check in your functions.php at the beginning there’s already ensured old WordPress installations will just skip this feature. But there remains one problem and before you just go ahead and update your theme(s) think about it: the old content in your blog doesn’t have a post thumbnail assigned to it through this new feature. You don’t want to have you or your theme users update all their older articles, right? And if you already use some sort of post image hack there’s probably a special function in your theme which does that.

So it’s a pretty good idea to make this backwards compatible with some quick if else voodoo, code shamelessly adapted from WP-Recipes:

if ( (function_exists('has_post_thumbnail')) && (has_post_thumbnail()) ) { 
  the_post_thumbnail(); 
} else { 
  $postimage = get_post_meta($post->ID, 'post-image', true); 
  if ($postimage) { 
    echo '<img src="'.$postimage.'" alt="" />';
  }
}

This first checks if the feature exists and if a post thumbnail was addd with this new feature. If it was, it simply returns the post thumbnail. If not, it falls back to whatever you’ve used in your theme before, the usual way is to check for and get the value of a special custom field named e.g. post-image and output it. You can add whatever you’ve used before inside the else statement. Et voilà, it’s nicely backwards compatible now, yay!

5. Resources And More Information

Well and that’s it. I would love to link to some smart WordPress Codex pages for these new template tags but at the time of this writing there simply isn’t anything in the Codex about this.

Oh no!

As always: before making your next coffee you should share this article on your favorite social website. Your vote is highly appreciated! After you’ve finished voting and making your next coffee or tea you could subscribe to my RSS-Feed, discuss this article or buy me my next coffee ;-)

Article Updates

12/20/2009 Added some resources and a note about the named arguments
12/20/2009 function check for add_theme_support at the beginning
12/20/2009 corrected the size array code under Custom Output
12/17/2009 Added some code examples to respect the media settings

146 Responses

  1. Joe Quinlan

    I’m having trouble with the title array.
    It displays the image’s title that is given to it from the Media Library when what I actually want is for it to display the Post Title. I’ve tried inserting in ‘title’ => ” in the required place but it just displays the title as rather than the actual title. I hope I’m making sense.

    Can anyone help at all?

  2. Starfall

    I was reading your articles as well as written comments by commentors, But @hay, I was looking for this answer. Thank you so much, for sharing your idea. I really love it. To Matt, I really appreciate your work. love it. I’m getting a hard time with timthumbs. Wew!

  3. Y3

    Is post thumbnails using timthumbs.php? I love the design and I will definitely try the plugin. Hope it has no error or need to fixed anything. I appreciate your work.

  4. Abhishek

    Can I use the same image meant for thumbnail as regular image with original size?

    By the way, cool theme of yours :)

  5. Rodrigo

    Hi, why i can’t define a thumbnail from a URL? Can anyone help me?

  6. Rodrigo

    Hi, i have one question.

    If you got add a post thumbnail in 3.2.1, and use the “From URL” option, there is no link to set the image specified as the thumbnail. You can only put it in the post. So can you fix this?

  7. Neopets

    Your article gave me the answer about thumbnails have to try this plug in to my new site. Thanks man brilliant!

  8. shahram

    Real i need the code for thumbnail so still not work for me, my version 3.3.1 and use front-page.php any one can help me thank you

  9. Jeremy

    Very nice tutorial Matthias.

    Do you know if it’s possible to upload 2 thumbnails by post with this features?

    To explain : I would like to use a thumbnail 200×75 in the category page, and the “same” thumbnail cropped at 50×50 in the sidebar (I can’t resize the first thumbnail, dimensions are not proportional).

    Thank’s !

  10. sahil

    great article…..well written……i just wanna know that is this possible to add more images in the same post with this function….

  11. Vipin

    thanks mattias for this post..
    and btw..you’ve got awesome theme…i liked interface…

  12. marcel

    Can you overwrite also just use the original image size whilst using the_post_thumbnail() function?

    • marcel

      I meant, Can you also just use the original size. Forget about overwrite

  13. shahram

    first all i say wow quick reply. so i’m not sure which one to update to ?? please, let me know which one thank you very much.

Have Your Say

Be nice, don't spam. You can just use Markdown. Code snippets should be wrapped in <code> tags. Everything in between gets automatically encoded to HTML entities, wrapped in pre tags and syntax highlighted.