Descargar imágenes externas si la publicación es pública

2

He programado publicaciones que contienen imágenes externas. Quiero que descargue automáticamente las imágenes & vinculado a la biblioteca de medios si el estado de la publicación es publicar. Ahora el problema es que mi código no descargará las imágenes cuando se publique la publicación programada. Funciona si crea la publicación y la publica de inmediato, pero no para una publicación de programación que luego se convierte en publicación.

¿Puede alguien ayudarme a arreglar el 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');     
    }
}
?>
    
pregunta Ruriko 16.09.2018 - 03:01

1 respuesta

7

Las publicaciones programadas no activan publish_post , solo actualizar la publicación en sí lo hará.

Agregue una acción para future_to_publish , consulte la referencia sobre las transiciones de estado de publicación . No creo que tengas acceso al objeto de usuario en ese caso, por lo que es posible que desees refactorizar eso.

Como alternativa, solo obtenga las imágenes cuando el usuario guarde la publicación, no cuando se publique. Use la acción save_post .

    
respondido por el janh 16.09.2018 - 10:21

Lea otras preguntas en las etiquetas