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

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:

Read More
  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.

Related posts

Leave a Reply

2 comments

  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);
    }  
    
  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?