Simple WordPress thumbnail function

Here is a quick function to extract the thumbnail image from the post. This is quite useful especially on older themes or if you are not using post thumbnail functionality of newer WordPress versions.

The function can be called within the loop. It will scan for image attachments and return the URL to thumbnail of the first image.

If no attachments are found, it would return the URL of the first image found (for example an externally linked image).

If no images are found, but a youtube video is embedded, it would return the thumbnail of the youtube video.

function vp_get_thumb_url($text)
{
  global $post;
 
  $imageurl="";        
 
  // extract the thumbnail from attached imaged
  $allimages =&get_children('post_type=attachment&post_mime_type=image&post_parent=' . $post->ID );        
 
  foreach ($allimages as $img){                
     $img_src = wp_get_attachment_image_src($img->ID);
     break;                       
  }
 
  $imageurl=$img_src[0];
 
 
  // try to get any image
  if (!$imageurl)
  {
    preg_match('/<\s*img [^\>]*src\s*=\s*[\""\']?([^\""\'>]*)/i' ,  $text, $matches);
    $imageurl=$matches[1];
  }
 
  // try to get youtube video thumbnail
  if (!$imageurl)
  {
    preg_match("/([a-zA-Z0-9\-\_]+\.|)youtube\.com\/watch(\?v\=|\/v\/)([a-zA-Z0-9\-\_]{11})([^<\s]*)/", $text, $matches2);
  
     $youtubeurl = $matches2[0];
     if ($youtubeurl)
      $imageurl = "http://i.ytimg.com/vi/{$matches2[3]}/1.jpg"; 
    else preg_match("/([a-zA-Z0-9\-\_]+\.|)youtube\.com\/(v\/)([a-zA-Z0-9\-\_]{11})([^<\s]*)/", $text, $matches2);
 
    $youtubeurl = $matches2[0];
    if ($youtubeurl)
      $imageurl = "http://i.ytimg.com/vi/{$matches2[3]}/1.jpg"; 
   }
  
  
 return $imageurl;
 }
 

Here is example usage within the home page loop to show the post thumbnail in the excerpt (this is actually used on my homepage).

 global $post;
  $thumb=vp_get_thumb_url($post->post_content); 
  if ($thumb!='') echo ''. get_the_title().'';

More like this:


Posted in: WordPress
TAGS:, , , , , , , , , , , , , , ,
Both comments and trackbacks are currently closed.

23 Comments

  1. Alfredo
    Jan 26th, 2012 10:10 PM

    Hi Vladimir,
    I'm publishing YouTube videos using a custom field named 'videourl'.
    Any idea of how to extract the video thumbnail image from that custom field?
    Thank you sharing your codes and for all you great work!

  2. Sep 9th, 2011 2:41 AM

    Hi,

    I have made a small improvement to your code:

    http://www.aeromental.net/2011/09/08/wordpress-how-to-create-thumbnails-in-your-index-from-youtube-videos-and-images-hosted-outside-imgur/

    It can create thumbs for images hosted outside in another service like Imgur, and also creates a default image if nothing was found.

    Thanks for the great work :) my blog looks better thanks to this.

    • Sep 9th, 2011 11:54 AM

      You are welcome, thanks for sharing

  3. Aug 2nd, 2011 7:06 PM

    Hey Vladimir thanks for this useful code but really i tired to get the images showing automatically in my posts in the home page i don't know what's wrong I've put the code in Function.php and again in home.php it still the same please help with these I'm using lifetime theme

  4. Jun 30th, 2011 8:28 PM

    Thank you so much for this function Vladimir! I love it and use it all the time. I had to make an adjustment recently to get it fetching the "featured image" first - posted the update on my (very lame) blog if you ever need it: http://blog.friendlywebconsulting.com/?p=177

    Thanks again!
    Michelle

  5. May 25th, 2011 11:56 PM

    I'm not really liking that it doesn't truly re-optimize the image to the correct size. It just changes the dimensions of the regular post image. This could be a page load nightmare. I'd say perhaps it's just not complete?

    • May 27th, 2011 11:16 PM

      That's why this one is called 'simple' Jason :)

    • Jun 30th, 2011 8:26 PM

      Jason, I think you can adjust that - just add this line in where you want to display the image:

      $thumb=vp_get_thumb_url($post->post_content, 'thumbnail');

      Change 'thumbnail' to whatever image size you'd like to display (thumbnail, medium, large or a custom size).

      Cheers, Michelle

  6. May 4th, 2011 6:47 PM

    Great Job!
    Really helpful.
    Thanks a bunch for sharing!
    :)

  7. Kyle
    Apr 29th, 2011 10:50 PM

    Hi there, great function. I have one question: when, in my post, I link to a photo from another website, the thumbnail pops up fine. However, when I use my own image, the thumbnail appears pixellated. I changed the width in the code that inserts the thumbnail on my index page (). What could be causing this?

    • ba-a
      May 9th, 2011 5:22 PM

      Hi, had the same issue, have found the solution by any chance?

  8. Jan 18th, 2011 7:45 PM

    Hi Vladimir, great post,

    was having a bitta trouble with your example code, kept getting "parse error" untill i realised your example code needed a ' (apostrophe) at the end... hope this helps anyone implementing the example code

    • Jan 19th, 2011 12:27 AM

      Fixed, thanks for the notice.

  9. Nov 30th, 2010 6:28 AM

    Thanks Goran , had to struggle through it for a while before realising this post has not been updated with your code yet.

    Great article. Thank!

  10. Nov 24th, 2010 3:07 PM

    Great Job!
    Really helpful.
    Thanks a bunch for sharing!
    :)

  11. Nov 22nd, 2010 9:25 PM

    How do I insert the above example usage code in the homepage loop? (I don't know php ;) )

    • Nov 30th, 2010 8:41 AM

      Yes, you can supply a parameter to wp_get_attachment_image_src google the function

  12. nicole
    Nov 9th, 2010 9:28 PM

    thank you very much! I think this is even better the the_post_thumbnail() function :)

  13. Nov 1st, 2010 2:35 AM

    is there a way to pull the medium sized image as opposed to the thumbnail? sorry, i'm not much of a programmer. thanks!

  14. Oct 31st, 2010 8:44 AM

    Thanks man! i was looking for somethign like this forever...

  15. Oct 28th, 2010 11:30 PM

    If video embedded in post, "preg_match" line should be changed to fetch ID:

    preg_match("/([a-zA-Z0-9\-\_]+\.|)youtube\.com\/(v\/)([a-zA-Z0-9\-\_]{11})([^<\s]*)/", $text, $matches2);

    • Nov 30th, 2010 8:41 AM

      Thanks for the tip!

  16. Oct 28th, 2010 9:45 AM

    Thanks, this would remove my nightmare to manually assign thumbnail images :)

  • ManageWP