it-swarm.com.de

Externe Bilder herunterladen, wenn der Beitrag veröffentlicht wird

Ich habe Posts geplant, die externe Bilder enthalten. Ich möchte, dass Bilder automatisch heruntergeladen und mit der Medienbibliothek verknüpft werden, wenn der Post-Status "Veröffentlichen" lautet. Jetzt ist das Problem, dass mein Code keine Bilder herunterlädt, wenn der Planungsbeitrag veröffentlicht wird. Dies funktioniert, wenn Sie den Beitrag erstellen und sofort veröffentlichen, jedoch nicht für einen Zeitplanbeitrag, der später zur Veröffentlichung konvertiert wird.

Kann mir jemand helfen, den Code zu reparieren?

<?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

Geplante Posts lösen publish_post nicht aus, dies wird nur durch das Aktualisieren des Posts selbst bewirkt.

Fügen Sie eine Aktion für future_to_publish hinzu, siehe Referenz zu Übergängen nach dem Status . Ich glaube nicht, dass Sie in diesem Fall Zugriff auf das Benutzerobjekt haben werden, daher möchten Sie dies möglicherweise umgestalten.

Alternativ können Sie die Bilder nur abrufen, wenn der Benutzer den Beitrag speichert, nicht, wenn er veröffentlicht wird. Verwenden Sie die Aktion save_post.

7
janh