web-dev-qa-db-fra.com

Télécharger des images externes si post est publié

J'ai programmé des publications contenant des images externes. Je veux que les images soient automatiquement téléchargées et liées à la médiathèque si le statut de la publication est publié. Maintenant, le problème est que mon code ne téléchargera pas les images lorsque la publication du programme sera publiée. Cela fonctionne si vous créez et publiez immédiatement la publication, mais pas pour une publication planifiée qui sera convertie ultérieurement en publication.

Quelqu'un peut-il m'aider à corriger le code?

<?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');     
    }
}
?>
2
Ruriko

Les publications programmées ne déclenchent pas publish_post, seule la mise à jour de la publication elle-même le fera.

Ajoutez une action pour future_to_publish, voir la référence sur les transitions post-statut . Je ne pense pas que vous ayez accès à l'objet utilisateur dans ce cas, alors vous voudrez peut-être refactoriser cela.

Vous pouvez également obtenir les images lorsque l'utilisateur enregistre la publication, et non lorsqu'elle est publiée. Utilisez l'action save_post.

7
janh