How do I set a featured image (thumbnail) by image URL when using wp_insert_post()?

While looking through the function reference entry for wp_insert_post(), I noticed that there’s no parameter in the array it requires which will allow me to set the ‘Featured Image’ for a post, displayed as the post thumbnail in my theme.

I have looked into functions like set_post_thumbnail(), as suggested by Mr. Bennett, but this seems to be a relatively new addition to WordPress itself and the WordPress codex. As such, there aren’t any sources that I can find which explain how the $thumbnail_id parameter should be acquired and supplied. If this really is the function to use, in what way could I provide it with a valid $thumbnail_id parameter when all I have is an image URL?

Read More

Thanks in advance!

Related posts

Leave a Reply

5 comments

  1. You can set an image as post thumbnail when it is in your media library. To add an image in your media library you need to upload it to your server. WordPress already has a function for putting images in your media library, you only need a script that uploads your file.

    Usage:

    Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id );
    
    // $post_id is Numeric ID... You can also get the ID with:
    wp_insert_post()
    

    Function:

    function Generate_Featured_Image( $image_url, $post_id  ){
        $upload_dir = wp_upload_dir();
        $image_data = file_get_contents($image_url);
        $filename = basename($image_url);
        if(wp_mkdir_p($upload_dir['path']))
          $file = $upload_dir['path'] . '/' . $filename;
        else
          $file = $upload_dir['basedir'] . '/' . $filename;
        file_put_contents($file, $image_data);
    
        $wp_filetype = wp_check_filetype($filename, null );
        $attachment = array(
            'post_mime_type' => $wp_filetype['type'],
            'post_title' => sanitize_file_name($filename),
            'post_content' => '',
            'post_status' => 'inherit'
        );
        $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
        $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
        $res2= set_post_thumbnail( $post_id, $attach_id );
    }
    

    http://codex.wordpress.org/Function_Reference/wp_upload_dir

    http://codex.wordpress.org/Function_Reference/wp_insert_attachment


    EDIT:
    Added path creation

    http://codex.wordpress.org/Function_Reference/wp_mkdir_p

  2. I’d like to improve Robs answer by utilizing the WP core functions download_url and media_handle_sideload

    <?php
    /**
    * Downloads an image from the specified URL and attaches it to a post as a post thumbnail.
    *
    * @param string $file    The URL of the image to download.
    * @param int    $post_id The post ID the post thumbnail is to be associated with.
    * @param string $desc    Optional. Description of the image.
    * @return string|WP_Error Attachment ID, WP_Error object otherwise.
    */
    function Generate_Featured_Image( $file, $post_id, $desc ){
        // Set variables for storage, fix file filename for query strings.
        preg_match( '/[^?]+.(jpe?g|jpe|gif|png)b/i', $file, $matches );
        if ( ! $matches ) {
             return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) );
        }
    
        $file_array = array();
        $file_array['name'] = basename( $matches[0] );
    
        // Download file to temp location.
        $file_array['tmp_name'] = download_url( $file );
    
        // If error storing temporarily, return the error.
        if ( is_wp_error( $file_array['tmp_name'] ) ) {
            return $file_array['tmp_name'];
        }
    
        // Do the validation and storage stuff.
        $id = media_handle_sideload( $file_array, $post_id, $desc );
    
        // If error storing permanently, unlink.
        if ( is_wp_error( $id ) ) {
            @unlink( $file_array['tmp_name'] );
            return $id;
        }
        return set_post_thumbnail( $post_id, $id );
    
    }
    
  3. Try using set_post_thumbnail().

    Edit by Otto: You clarified your question, so I’ll clarify the response Chip gave.

    Basically, you need to make the ‘attachment’ for the post as well. When an image is uploaded into the WordPress media library, a special post entry is made for it with a post type of attachment. This attachment is linked to some specific post via the post_parent identifier.

    So if you know the ID of the attachment, then calling set_post_thumbnail with the post object or ID and the attachment ID will simply set the post thumbnail flag.

    If you have not created the attachment yet, then you will need to do that first. Easiest way to do that is with wp_insert_attachment(). This function takes an array of a few parameters, the filename (the file must already be in the proper uploads directory), and the post ID of the parent post that you want to attach the attachment to.

    Just having a file uploaded and attached to a post doesn’t do anything automatically. This is simply a sort of categorization mechanism. The gallery mechanism, for example, uses the attached images of a post to build the [gallery] for that post. A thumbnail for a post is just one of the attached images which has be set to be the thumbnail.

    More info on how to use wp_insert_attachment can be found in the codex (linked above).

  4. Just found this and made it much simpler, works but I’m no security scrubber

    if(!empty($_FILES)){
        require_once( ABSPATH . 'wp-admin/includes/post.php' );
        require_once( ABSPATH . 'wp-admin/includes/image.php' );
        require_once( ABSPATH . 'wp-admin/includes/file.php' );
        require_once( ABSPATH . 'wp-admin/includes/media.php' );
    
        $post_ID = "your post id!";
    
        $attachment_id = media_handle_upload( 'file', $post_ID );
        set_post_thumbnail( $post_ID, $attachment_id );
    }
    

    simple or what? after getting the right files, wordpress will handle the media and upload it, then set it as a thumbnail.

  5. set_post_thumbnail() is the best function for this requirement.

    I think, you find the ID of an attachment via get_children() or get_posts(). The result have an array and inside this array is the ID. The follow example for testing; i hope it works; write without tests, only on scratch.

    For your requirement it is important, that you change get_the_ID() with your post-ID; return the ID of the Attachment and this can you use foth set_post_thumbnail().

    $attachments = get_children( 
        array(
            'post_parent' => get_the_ID(), 
            'post_type' => 'attachment', 
            'post_mime_type' => 'image'
        )
    );
    foreach ( $attachments as $attachment_id => $attachment ) {
        echo wp_get_attachment_image($attachment_id);
    }