How to Add a Featured Image from a URL in WordPress

Sometimes you need to dynamically add a featured image to a post or a custom post type from another server than the one your WordPress install is running. And you’re facing a common issue: how to do it?

Of course in this case, you need to grab the featured image from the second server, download it to your own server, in the upload folder, and assign it to the correct post. In the first step we are going to create a new post dynamically, and then we’ll deal with the featured image.

Step 1: Create a Post Dynamically

To dynamically create a post, you need to use the wp_insert_post() function. You can place the code below in an “IF” statement, otherwise each time a page is loaded it will create a new post. Not that handy.

// Register Post Data
$post = array();
$post['post_status']   = 'publish';
$post['post_type']     = 'post'; // can be a CPT too
$post['post_title']    = 'My New Post';
$post['post_content']  = 'My new post content';
$post['post_author']   = 1;

// Create Post
$post_id = wp_insert_post( $post );

Running this code will simply create a new post. Now it’s time to add the featured image.

Step 2: Add the Featured Image

To add the featured image from a URL, we have to use some WordPress functions:

And now here is the code. I commented each action so that you can see exactly what’s happening when this script is running.

// Add Featured Image to Post
$image_url        = 'http://s.wordpress.org/style/images/wp-header-logo.png'; // Define the image URL here
$image_name       = 'wp-header-logo.png';
$upload_dir       = wp_upload_dir(); // Set upload folder
$image_data       = file_get_contents($image_url); // Get image data
$unique_file_name = wp_unique_filename( $upload_dir['path'], $image_name ); // Generate unique name
$filename         = basename( $unique_file_name ); // Create image file name

// Check folder permission and define file location
if( wp_mkdir_p( $upload_dir['path'] ) ) {
    $file = $upload_dir['path'] . '/' . $filename;
} else {
    $file = $upload_dir['basedir'] . '/' . $filename;
}

// Create the image  file on the server
file_put_contents( $file, $image_data );

// Check image file type
$wp_filetype = wp_check_filetype( $filename, null );

// Set attachment data
$attachment = array(
    'post_mime_type' => $wp_filetype['type'],
    'post_title'     => sanitize_file_name( $filename ),
    'post_content'   => '',
    'post_status'    => 'inherit'
);

// Create the attachment
$attach_id = wp_insert_attachment( $attachment, $file, $post_id );

// Include image.php
require_once(ABSPATH . 'wp-admin/includes/image.php');

// Define attachment metadata
$attach_data = wp_generate_attachment_metadata( $attach_id, $file );

// Assign metadata to attachment
wp_update_attachment_metadata( $attach_id, $attach_data );

// And finally assign featured image to post
set_post_thumbnail( $post_id, $attach_id );

What’s interesting in this code is that you can place it in a loop. For example to import posts from a CSV file, or an XML file. This is really powerful and really useful, but don’t forget  one thing: never ever use this script in your functions.php file without placing a conditional tag before otherwise you’ll get hundreds of new posts created in a matter of minutes!

You found this snippet useful? Please leave a comment and tell us what you created from this snippet!

  • Updated on:
  • Posted Under: Tutorials
Post Author: Remi

Remi is an expert WordPress developer that coded many great free and premium themes and plugins. His experience on WordPress allows him to produce great stuff and to propose advanced tutorials.

Disclosure
Got something to say? Join the discussion.
  1. AJ Clarke | WPExplorer says:
    AJ Clarke | WPExplorer
    This is a great guide. I'd love to hear an example of how you've used this in the past ;)
    Admin
    • littledevil2014 says:
      for some reason...the image attached is always broken... i can never see the image except ..see only the broken icon with name of the file next to it. how do i fix it
  2. Fco. Javier Prada says:
    Simply Great. Thank you, very much!
  3. thenetbreeze says:
    Thank you for your code and explanation. It's useful for me and I'll use it on my current project: I have to import a large number of posts into wordpress from typo 3 platform by means of an xml file (rss format). I have worked with rss feeds (show the rss items from other websites on my website pages). I'll use now the rss feeds in order to insert these rss items as posts in my wordpress database.
  4. Hi Remi Man... You SAVE MY LIFE... your script have worked for me!!! Thanks a million
  5. One question: How can I change/update the description/caption/alternative text of every image?
  6. easycondor says:
    Hello, First nice post. Thanks ! I want to insert a featured image but I dont want to upload this image, just to asign an url (my image is present in my library). How do I do ? Thanks.
    • AJ Clarke | WPExplorer says:
      AJ Clarke | WPExplorer
      You'll only be able to do it via editing your theme code. Unless there is a 3rd party plugin that you can use, which I personally am not aware of. Have a look at WordPress.org.
      Admin
  7. CasperTi says:
    Is it possible copy multiple files at once, I have custom field with multiple url and need add all those linked images url to wp media library. Your script allow add only one image url as a featured image: Thanks, great script! Casp
    • AJ Clarke | WPExplorer says:
      AJ Clarke | WPExplorer
      There is only 1 Featured image...That's basically the definition of a featured image. If you need multiple images attached to the post the best way is via meta options, for example how this plugin works - http://wordpress.org/plugins/easy-image-gallery/
      Admin
  8. Honza Gál says:
    And so try media_sideload_image? http://wordpress.stackexchange.com/a/46365 It is better solution, by me.
  9. iamnormal0 says:
    I still don't understand why we can't use a URL as a featured image?
    • AJ Clarke says:
      AJ Clarke
      It's for security reasons also to prevent people from hot-linking to other sites and stealing bandwidth.
      Admin
      • 康邁克 says:
        AJ Clarke, you have a valid statement "to prevent people from hot-linking to other sites and stealing bandwidth." However, when the "other site" is our own S3 bucket with Cloudfront enabled, this is a much better solution than using a hosting providers slow slow delivery of featured images that we are required to store on the site. Currently our site's front page is taking 52sec to load (!?) and it's all because of featured images (which are the only images on our site not hosted by S3... [rolling my eyes in disbelief at the ridiculousness of this scenario...]). Our hosting provider WPEngine does not allow caching plugins either. I have no idea what to do with the code above. Is there anyway to package it into a plugin, and will it work as it is written as a plugin? I already have a WooCommerce S3 plugin which allows me to link all media to our site through easy authenticated links. The solution I'm looking for on each of my posts is something simple like: [featured_image][s3 link][/featured_image]
        • AJ Clarke says:
          AJ Clarke
          That sounds a bit crazy (52 secs) on WPEngine. I've never seen a site slower then 6sec load on this host. Are you positive the issues are actually with the images? Also have you made sure you aren't loading massive images (more then 1mb each)? I do realize that Amazon S3 is really cheap (I have them as well for hosting download files) but WPEngine also has a CDN service built-in, have you tried it instead? It would definitely make things extremely easy because all you need to do is check 1 box and everything is setup for you. Also the WPEngine caching is way better then using a plugin, so don't stress about that ;) Regarding the code above...this is an advanced tutorial for developers, it definitely doesn't sound like something that would fit your needs. Sorry ;(
          Admin
      • I found this Featured Image From URL plugin i think it allow us using url for featured image post
        • AJ Clarke says:
          AJ Clarke
          Yes, you can use this code to automatically set a featured image given a URL. This is to be used in your theme or plugin, it doesn't add a field to enter a URL though.
          Admin
  10. Was searching for one hour...thanks for share
  11. Shahbaz Badar says:
    You are awesome. Thank you.
  12. Great code, helped me a lot! Thank you!! Although wp_generate_attachment_metadata() does not generate my custom image file sizes set in functions.php. Any idea how this can be achieved?
    • AJ Clarke says:
      AJ Clarke
      For security reasons the image cropping functions in WordPress will not crop an external url and then save it to your site. You'll need to use a 3rd party resizing script like TimbThumb for this (creates a temp folder with cropped images). Plus, if you are using an external url and want to crop it and save it to your site anyway, you should just upload it to your media library to start with.
      Admin
  13. Manoj Sharma says:
    Thanks you so much. its what thati want love it
  14. Hi there, what an awesome useful piece of code! I have ultimate csv import pro importing posts from a csv weekly, but I need to assign a featured image... Is it possible to use step 2 to upload the images and assign the featured image via a unique custom field value that matches the image name? I have a string that places the image on a post from a URL using a custom field as the file name, works perfect. Just trying to get the featured image
  15. Great, thanks a lot
  16. Thanks for this tutorial. You're genious :)
  17. Thanks you so much.
  18. Alexey Vertinsky says:
    Thank you! Very useful article!
  19. Kevin Brent says:
    I am trying to use this code. The $image_url is for an image already on the local server in the /wp-content/uploads/. But not in the media library. I uploaded images via ftp. I am reusing the same set of images. I keep getting this error. Fatal error: Call to a member function using_permalinks() on a non-object in /home/my_user/my_url.com/wp-includes/link-template.php on line 401 Result is: image is inserted blank in the media library with no file extension. No image is set to featured image. Thanks in advance for your help.
  20. jegadeesh says:
    hi...if any possible for insert external image url to wordpress post featured image without saving image file into our upload folder.
  21. Thanks, really helped!
  22. Kevin Brent says:
    I was able to get this working. It actually didn't have anything to do with this code. It was how I declared another function earlier in my code. This code works perfectly. Thanks
  23. Abid Nevesinjac says:
    Really great post. I was searching over 2 hours for some good snippet to insert new post and featured image from external site (actually from JSON API from external site). Didn't test it yet, but it look perfect to me, so i am going to implement it in my new project. Thank you for sharing
  24. Two years after the post and the code still works like a champ. Second link I looked at. First one told me to buy a plugin that did not have anything to do with what I needed. Thank you for this great detailed post. Once I integrated the code with my create post loop. It worked the first try. Only had to replace the static url with my $url variable done. Thank You!!!!
  25. Great post, however the code doesn't take into consideration files that have the same name. We need to check the directory and increment the file name value if already exists. $upload_dir = wp_upload_dir(); // Set upload folder $image_data = file_get_contents($image_url); // Get image data $newfilename = wp_unique_filename( $upload_dir['path'], $NAME_OF_IMAGEFILE_WITH_EXTENSION ); $filename = basename($newfilename); // Create image file name one extra line of code did the trick for me to set the filename to something unique.
    • AJ Clarke says:
      AJ Clarke
      You are correct! Awesome, thank you for sharing I have updated the code on the post.
      Admin
  26. still useful, thx! :)
  27. thanks for this code <3 ... but one question.. what if I want to get url of featured image after it assigned to the post ?
    • AJ Clarke says:
      AJ Clarke
      Great, I am glad you found it useful. If you want to get the featured image URL, you can use the WordPress function wp_get_attachment_url() which will return the URL of any image defined in the the media library.
      Admin
  28. teddyatpixventive says:
    I have been looking for this piece of a code for days now, Thanks a mill Remi!!
  29. rvghoghari says:
    Thank you very much for this code
  30. Ahmad Sayeed says:
    Awesome - easy to understand and easy to implement. Thanks Remi, I am also looking to upload the image then set it to the feature image. Have you written about that? Let me know please.
    • AJ Clarke says:
      AJ Clarke
      Setting the image as the featured image is mentioned in the code via the set_post_thumbnail() function which is the last line of the second snippet. Please have another look.
      Admin
  31. NGUYEN NGOC PHU says:
    I'd like to say thank you. This is great guide.
  32. tnx a lot works like a charm
  33. Thank you! Works with latest WP 4.7.2 I will use this to include thumbnails when auto-importing albums as woocommerce product.
  34. Cédric de Mondenard says:
    You just saved my day with a quick, clean and well documented code. You deserve a winning cup. 🏆
  35. Worked perfectly on WP 4.8.2 10/28/17.. Awesome! Thank you so much.
  36. Hi This is prabhu. i'm a web developer and i work with WordPress. you article about how to add features image from a URL in WordPress is a useful information. its really a worth one. Thanku so much.

Leave a Reply

Your email address will not be published. Required fields are marked *