0

I have lots of schedule posts containing external images and I want to be able to auto download the images & linked to media library when the post status changes to publish.

This is the code so far but it doesn't work:

<?php  
/*  
Plugin Name: NA
Version: 1.0
*/
add_action('future_to_publish', 'fetch_images', 10, 1);

function fetch_images( $post_ID )  
{   
    //Check to make sure function is not executed more than once on save
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
    return;

    if ( !current_user_can('edit_post', $post_ID) ) 
    return;

    remove_action('future_to_publish', 'fetch_images');  

    $post = get_post($post_ID);   

    $first_image = '';

    if(preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches)){
        $first_image = $matches [1] [0];
    }

    if (strpos($first_image,$_SERVER['HTTP_HOST'])===false)
    {

        //Fetch and Store the Image 
        $get = wp_remote_get( $first_image );
        $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 );

        $updated = str_replace($first_image, $mirror['url'], $post->post_content);

        //Replace the image in the post
        wp_update_post(array('ID' => $post_ID, 'post_content' => $updated));

        // re-hook this function
        add_action('future_to_publish', 'fetch_images', 10, 1);     
    }
}
?>

Can anyone please help fix this code?

1 Answer 1

0

Use transition_post_status instead. Reference: https://codex.wordpress.org/Post_Status_Transitions

3
  • I replaced future_to_post with transition_post_status but it still doesn't work Sep 30, 2018 at 0:23
  • What do mean still not working? Is giving an error, it returns something? Sep 30, 2018 at 15:32
  • There's no error it just doesn't download the image when the post status changes to publish Sep 30, 2018 at 22:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.