Faça o download de imagens externas se a postagem for publicada

2

Eu agendei postagens que contêm imagens externas. Quero que faça o download automático de imagens & vinculado à biblioteca de mídia se o status da postagem for publicado. Agora o problema é que o meu código não faz o download de imagens quando a publicação da programação é publicada. Funciona se você criar a postagem e publicar imediatamente, mas não para uma publicação de agendamento que depois será convertida para publicação.

Alguém pode me ajudar a corrigir o código?

<?php  
/*  
Plugin Name: Download External images
Version: 1.0
*/
add_action('publish_post', 'fetch_images');

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('publish_post', '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('publish_post', 'fetch_images');     
    }
}
?>
    
por Ruriko 16.09.2018 / 03:01

1 resposta

7

As postagens agendadas não acionam publish_post , somente atualizar a postagem em si fará isso.

Adicione uma ação para future_to_publish , consulte a referência sobre as transições de status de postagem . Eu não acredito que você terá acesso ao objeto de usuário nesse caso, então você pode querer refatorar isso.

Alternativamente, é só pegar as imagens quando o usuário salva a postagem, não quando ela é publicada. Use a ação save_post .

    
por janh 16.09.2018 / 10:21