How to retrieve image from URL and set as featured image/post thumbnail

The question:

Given a Vimeo ID, I can retrieve a thumbnail from the video via Vimeo Simple API. Rather than call the API every time my page loads I want to set the image as the post thumbnail using the save_post hook (similar to this question).

My problem is that I am not familiar with URL calls in php. I would like to know:

  1. the benefits/drawbacks of using a method like curl compared to WP_Http. Is one “better” than the other?

  2. the order in which I should call functions to successfully set the post thumbnail.

Any help would be greatly appreciated.

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

My favorite way of handling this problem has been to use a little documented function I discovered on another stack post: media_sideload_image

It works by fetching an image url to the WordPress upload dir and then associating the image to a post’s attachments.

You can try it like so:

// required libraries for media_sideload_image
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');

// $post_id == the post you want the image to be attached to
// $video_thumb_url == the vimeo video's thumb url
// $description == optional description

// load the image
$result = media_sideload_image($video_thumb_url, $post_id, $description);

// then find the last image added to the post attachments
$attachments = get_posts(array('numberposts' => '1', 'post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC'));

if(sizeof($attachments) > 0){
    // set image as the post thumbnail
    set_post_thumbnail($post_id, $attachments[0]->ID);

Method 2

Hi @David John Smith:

1.) If you are in WordPress, (almost) always use WP_Http; it’s one of the many things I love about working with WordPress. Why call it and not CURL? Well, because it has a nicer syntax and it calls CURL if CURL is available. If not, it chooses from one of 3 other options. So it really is a brilliant piece of kit.

2.) To answer the 2nd question I’ll need to know how you want to name the files you are downloading?

All methods was sourced from or, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment