8
votes

I have some post id's and I want to set these posts' featured images from same url.

Here is my adding post codes:

$catid = get_cat_ID("XX Cat");

$my_post = array(); 
$my_post['post_title'] = $title; 
$my_post['post_content'] = $description; 
$my_post['post_status'] = 'publish'; 
$my_post['post_author'] = 1; 
$my_post['post_category'] = array( $catid ); 

$post_id = wp_insert_post( $my_post );

Example: post_id = 1 I want to set featured image to: example.com/image.png

How can I do this?

3

3 Answers

25
votes

You can set an image as post featured thumbnail when it is in your media library. To add an image in your media library you need to upload it to your server.

try this code:

// 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 );

ref url : http://www.wpexplorer.com/wordpress-featured-image-url/

Modified as your requirement: or that purpose ignore WordPress standard and upload your all post single image on your custom folder and add this image path or direct external image url into post as extra attribute meta field and when you will show post on your theme then just use your img with help of post id. demo code: for setting image

<?php
    update_post_meta ( 7, 'imgkey', 'www.url.path' );//7 is post id
?>

for getting image on your theme page where you want to show it

<?php
    $img_value = get_post_meta( get_the_ID(), 'imgkey', true );
?>
<img src="<?php echo $img_value?>">

Note if you are new in WordPress post custom meta fields then read this article: https://codex.wordpress.org/Custom_Fields
or
unofficial article about custom fields: https://premium.wpmudev.org/blog/creating-custom-fields-manually

11
votes

if you have to load an image and then assign as thumbnail of the post, the quicker way is to use media_sideload_image and then set_post_thumbnail

https://developer.wordpress.org/reference/functions/media_sideload_image/

$url     = "http://url-of-the-image.jpg";
$post_id = [post id]
$desc    = "image description";

$image = media_sideload_image( $url, $post_id, $desc,'id' );

set_post_thumbnail( $post_id, $image );
-1
votes

I used wordpress' media manager wp.media to upload featured images from a form in my plugin. It has it's own advantages and it's pretty simple.

Wordpress media manager

HTML part: In the html form you only need 2 elements, a button and a hidden input field to store the image ID and send with the form. (You can use ajax to update but in my case, this method was simpler)

<input type="button" name="select-thumbnail" class="button" Value="Select Thumbnail">
<input type="hidden" name="thumbnail-id" value="">

Javascript (jQuery): On the javascript, you need to-

  1. open the media manager on button click
  2. insert the id into hidden input when an image is selected

jQuery('input[name="select-thumbnail"]').click(function(e) {
  e.preventDefault();
    
  var thumbMediaManager;
  //open if already initialized
  if(thumbMediaManager) {
    thumbMediaManager.open();
    return;
  }
        
  //create media manafer
  thumbMediaManager = wp.media({
    title: 'Select Thumbnail',
    multiple: false,
    library : {
    type : 'image',
    }
  });
        
  //when an image is selected
  thumbMediaManager.on('select', function() {
  var selection = thumbMediaManager.state().get('selection').first().toJSON();
  //console.log(selection);

  //insert the id into input field
  jQuery('input[name="thumbnail-id"]').val(selection.id);
    
  //Finally, open the media manager
  thumbMediaManager.open();
});

PHP: When the form is submitted, retrieve the image attachment ID, and get the post id (from wp_insert_post in my case), and use set_post_thumbnail()

$thumbnail_attachment_id = sanitize_text_field($_POST['thumbnail-id']);
$postId = wp_insert_post($newPost);

set_post_thumbnail($postId, $thumbnail_attachment_id);

set_post_thumbnail: https://developer.wordpress.org/reference/functions/set_post_thumbnail/