WordPress.org

Ready to get started?Download WordPress

Forums

wp_remote_get to upload image corrupts - local fiel alternative? (2 posts)

  1. daverage
    Member
    Posted 1 year ago #

    Hi.

    I have been using the following code to upload the first image on a page as the featured image

    function catch_that_image() {
      global $post, $posts;
      $first_img = '';
      ob_start();
      ob_end_clean();
      $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
      $first_img = $matches [1] [0];
    
      if(empty($first_img)){ //Defines a default image
        $first_img = "/images/default.jpg";
      }
      return $first_img;
    }
    
    function save_first_image(){
    	global $post, $posts;
    	$first_image = catch_that_image();
    	$post_id = $post -> post_id;
    	$args = array('timeout' => '1200');
    	$get = wp_remote_get( $first_image,$args );
    
    	$type = wp_remote_retrieve_header( $get, 'content-type' );
    	$mirror = wp_upload_bits(rawurldecode(basename( $first_image )), '', wp_remote_retrieve_body( $get ) );
    	//Attachment options
    	$attachment = array(
    	'post_title'=> basename( $first_image ),
    	'post_mime_type' => $type
    	);
    	// Add the image to your media library and set as featured image
    	$attach_id = wp_insert_attachment( $attachment, $mirror['file'], $post_id );
    	$attach_data = wp_generate_attachment_metadata( $attach_id, $first_image );
    	wp_update_attachment_metadata( $attach_id, $attach_data );
    	set_post_thumbnail( $post_id, $attach_id );
    }

    It was working fine, but now seems to be always attaching a broken image.

    Does anyone have experience of this - I am wondering if it is cloudflare causing the issue - but when I disable it, it is still uploading broken images.

    All of the images are stored in a folder in the webroot of the site - is there a way to upload without using wp_remote_get?

    Thanks

  2. daverage
    Member
    Posted 1 year ago #

    Hah, done it again - after hours of searching find the answer straight after posting here!!

    function save_first_image(){
        	global $post, $posts;
        	$image_url = catch_that_image();
        	$post_id = $post -> 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 );
        	wp_update_attachment_metadata( $attach_id, $attach_data );
    
        	set_post_thumbnail( $post_id, $attach_id );
        }

Topic Closed

This topic has been closed to new replies.

About this Topic