Unduh gambar dari halaman web ke folder unggahan default

8

Saya menulis tema / plugin khusus di mana saya perlu mengunduh gambar secara programatik dari halaman web tertentu ke folder unggah dan kemudian menyisipkannya sebagai bagian dari posting.

Jadi, saya dapat menemukan url gambar secara terprogram, dan kemudian saya perlu menyimpannya ke folder unggah di bawah konten-wp, namun folder itu memiliki struktur folder WordPress khusus di dalamnya untuk gambar yang disimpan.

Sekarang pertanyaan saya adalah, apakah ada WordPress API atau fungsi atau metode yang memungkinkan saya untuk mengunduh gambar dari web dan menyimpannya ke folder unggahan? Dan jika demikian, apa itu.

Kalau tidak, apa yang harus saya lakukan untuk menyimpan gambar-gambar itu?

Sejauh ini, saya melakukan ini

$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 );

Tetapi kode di atas memberi saya kesalahan berikut

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

Dan setelah diselidiki lebih lanjut, sepertinya kesalahan itu disebabkan oleh

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

Dan setelah penyelidikan lebih lanjut, dokumentasi untuk wp_insert_attachment()menyatakan bahwa The file MUST be on the uploads directorysehubungan dengan$image_file_name

Jadi, bagaimana cara mengunduh gambar dan menyimpannya ke posting saya dengan benar?

Terima kasih banyak.

Greeso
sumber
Saya punya masalah dengan ini ketika masalah izin pada gambar di direktori unggah - mereka harus dimiliki oleh pengguna server (misalnya www-data di apache / linux)
icc97
topik dukungan WordPress ini memiliki info lebih lanjut
icc97

Jawaban:

11

Baru-baru ini saya harus melakukan ini melalui skrip cron malam untuk aliran media sosial. $ parent_id adalah ID posting yang ingin Anda lampirkan gambarnya.

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);
divups
sumber
1

Anda belum memposting kode yang digunakan untuk mengambil dan menyimpan gambar, jadi tidak mungkin untuk mengatakan di mana kesalahannya.

Coba kode ini untuk mengambil dan menyimpan gambar:

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

Kemudian cukup gunakan fungsi-fungsi ini dalam kombinasi dengan kode Anda, seperti:

$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
}

Ingat juga bahwa Anda harus memasukkan wp-admin / include / image.php dalam kode Anda agar fungsi wp_generate_attachment_metadata()berfungsi, lihat Codex

Semoga bantuan ini, tetapi harap dicatat bahwa semua kode di sini tidak diuji.

gmazzap
sumber
2
Solusi @Effrey Barrett baik. Lebih banyak wordpress daripada milik saya (dan sedikit lebih lambat, karena WP HTTP API melakukan banyak hal ). Hal ini dapat lebih baik jika memeriksa kesalahan di upload sebelum memasukkan posting lampiran: if ( $mirror['error'] ) return false; //maybe log error. Juga tidak ada pemeriksaan apakah konten yang diambil sebenarnya adalah gambar$filetype = wp_check_filetype($filename, NULL ); if ( ! substr_count($filetype['type'], 'image') ) return false;
gmazzap
0

Anda dapat menggunakan fungsi ini untuk mengunggah gambar secara jauh ke folder unggahan dan menetapkannya sebagai gambar unggulan.

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 );
    }
}

Pemakaian:

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

Cukup gunakan fungsi default wp (v2.6.0 +):

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

fdrv
sumber