Scarica un'immagine da una pagina Web nella cartella di upload predefinita


8

Sto scrivendo un tema / plug-in personalizzato in cui devo scaricare le immagini in modo programmatico da determinate pagine Web nella cartella di caricamento e quindi inserirle come parte del post.

Quindi, sono stato in grado di trovare l'URL dell'immagine a livello di codice e quindi devo salvarli nella cartella di caricamento in wp-content, tuttavia quella cartella ha una struttura di cartelle WordPress specifica al suo interno per le immagini salvate.

Ora la mia domanda è: esiste un'API WordPress o una funzione o un metodo che mi permetterà di scaricare immagini dal Web e salvarle nella cartella dei caricamenti? E se è così, che cos'è.

Altrimenti, cosa devo fare per salvare quelle immagini?

Finora lo sto facendo

$filetype = wp_check_filetype(basename($image_file_name), null );

$upload_dir = wp_upload_dir();

$attachment = array(
    'guid' => $upload_dir['url'] . '/' . basename( $image_file_name ), 
    'post_mime_type' => $filetype['type'],
    'post_title' => preg_replace('/\.[^.]+$/', '', basename($image_file_name)),
    'post_content' => '',
    'post_status' => 'inherit'
);

$attachment_id = wp_insert_attachment( $attachment, $image_file_name, $post_id );

$attachment_data = wp_generate_attachment_metadata( $attachment_id, $image_file_name );

wp_update_attachment_metadata( $attachment_id,  $attachment_data );
set_post_thumbnail( $post_id, $attachment_id );

Ma il codice sopra mi sta dando il seguente errore

imagejpeg(http://wscdn.bbc.co.uk/worldservice/assets/images/2013/07/21/130721173402_egypts_new_foreign_minister_fahmy_304x171_reuters-150x150.jpg): failed to open stream: HTTP wrapper does not support writeable connections in C:\dev\wordpress\pterodactylus\wp-includes\class-wp-image-editor.php on line 334

E dopo ulteriori indagini, sembra che l'errore sia causato da

$attachment_data = wp_generate_attachment_metadata( $attachment_id, $image_file_name );

E dopo ulteriori indagini, la documentazione per gli wp_insert_attachment()stati che The file MUST be on the uploads directoryper quanto riguarda il$image_file_name

Quindi, come posso scaricare un'immagine e salvarla nel mio post correttamente?

Molte grazie.


Ho avuto problemi con questo quando si trattava di un problema di autorizzazioni sulle immagini nella directory dei caricamenti - dovevano essere di proprietà dell'utente del server (ad es. Dati www su apache / linux)
icc97

questo argomento di supporto di WordPress ha maggiori informazioni
icc97

Risposte:


11

Di recente ho dovuto farlo tramite uno script cron notturno per un flusso di social media. $ parent_id è l'ID del post a cui vuoi allegare l'immagine.

function uploadRemoteImageAndAttach($image_url, $parent_id){

    $image = $image_url;

    $get = wp_remote_get( $image );

    $type = wp_remote_retrieve_header( $get, 'content-type' );

    if (!$type)
        return false;

    $mirror = wp_upload_bits( basename( $image ), '', wp_remote_retrieve_body( $get ) );

    $attachment = array(
        'post_title'=> basename( $image ),
        'post_mime_type' => $type
    );

    $attach_id = wp_insert_attachment( $attachment, $mirror['file'], $parent_id );

    require_once(ABSPATH . 'wp-admin/includes/image.php');

    $attach_data = wp_generate_attachment_metadata( $attach_id, $mirror['file'] );

    wp_update_attachment_metadata( $attach_id, $attach_data );

    return $attach_id;

}

ex:

uploadRemoteImageAndAttach('http://some-external-site.com/the-image.jpg', 122);

1

Non hai pubblicato il codice utilizzato per recuperare e salvare l'immagine, quindi è impossibile dire dove si trova l'errore.

Prova questo codice per afferrare e salvare l'immagine:

function my_grab_image($url = NULL, $name = NULL ) {
  $url = stripslashes($url);
  if ( ! filter_var($url, FILTER_VALIDATE_URL) ) return false;
  if ( empty($name )) $name = basename($url);
  $dir = wp_upload_dir();
  $filename = wp_unique_filename( $uploads['path'], $name, NULL );
  $filetype = wp_check_filetype($filename, NULL );
  if ( ! substr_count($filetype['type'], 'image') ) return false;
  try {
    $image = my_fetch_image($url);
    if ( ! is_string($image) || empty($image) ) return false;
    $save = file_put_contents( $dir['path'] . "/" . $filename, $image );
    if ( ! $save ) return false;
    return $dir['path'] . "/" . $filename;
  } catch ( Exception $e ) {
    // echo $e->getMessage(); // Is a good idea log this error
    return false;
  }
}

function my_fetch_image($url) {
  if ( function_exists("curl_init") ) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $image = curl_exec($ch);
    curl_close($ch);
    return $image;
  } elseif ( ini_get("allow_url_fopen") ) {
    $image = file_get_contents($url, false);
    return $image;
  } else {
    throw new Exception('curl is not available and fopen url is disallowed');
  }
}

Quindi usa semplicemente queste funzioni in combinazione con il tuo codice, in questo modo:

$image_file_name =  @my_grab_image('http://this.is.the.image.url/image.jpg');
if ( $image_file_name && file_exists($image_file_name) ) {
  // PUT HERE YOUR CODE
}

Ricorda anche che devi includere wp-admin / Includes / image.php nel tuo codice affinché la funzione wp_generate_attachment_metadata()funzioni, vedi il Codice

Spero che questo aiuto, ma tieni presente che tutto il codice qui non è testato.


2
La soluzione @Jeffrey Barrett è buona. È più wordpress del mio (e un po 'più lento, perché l'API HTTP WP fa molte cose ). Può essere meglio se controllo degli errori durante il caricamento prima di inserire postale allegato: if ( $mirror['error'] ) return false; //maybe log error. Inoltre non è possibile verificare se il contenuto recuperato sia effettivamente un'immagine$filetype = wp_check_filetype($filename, NULL ); if ( ! substr_count($filetype['type'], 'image') ) return false;
gmazzap

0

Puoi utilizzare questa funzione per caricare in remoto un'immagine nella cartella dei caricamenti e impostarla come immagine in primo piano.

function set_remote_featured_image($file, $post_id) {
    if ( ! empty($file) ) {
        // Download file to temp location
        $tmp = download_url( $file );

        // Set variables for storage
        // fix file filename for query strings
        preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
        $file_array['name'] = basename($matches[0]);
        $file_array['tmp_name'] = $tmp;

        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }

        // do the validation and storage stuff
        $id = media_handle_sideload( $file_array, $post_id, $desc );
        // If error storing permanently, unlink
        if ( is_wp_error($id) ) {
            @unlink($file_array['tmp_name']);
            return $id;
        }

        set_post_thumbnail( $post_id, $id );
    }
}

Uso:

set_remote_featured_image("http://example.com/image.jpg", 1);

0

Usa la funzione wp (v2.6.0 +) predefinita:

media_sideload_image ($ file, $ post_id, $ desc, $ return);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.