Tải hình ảnh từ một trang web về thư mục tải lên mặc định


8

Tôi đang viết một chủ đề / plugin tùy chỉnh trong đó tôi cần tải xuống hình ảnh theo chương trình từ một số trang web nhất định vào thư mục tải lên và sau đó chèn chúng như một phần của bài đăng.

Vì vậy, tôi đã có thể tìm thấy url hình ảnh một cách lập trình, và sau đó tôi cần lưu chúng vào thư mục tải lên dưới nội dung wp, tuy nhiên thư mục đó có cấu trúc thư mục WordPress cụ thể bên trong nó cho các hình ảnh đã lưu.

Bây giờ câu hỏi của tôi là, có API hoặc chức năng hoặc phương pháp WordPress sẽ cho phép tôi tải xuống hình ảnh từ web và lưu chúng vào thư mục tải lên không? Và nếu như vậy, nó là gì.

Nếu không, tôi nên làm gì để lưu những hình ảnh đó?

Cho đến nay, tôi đang làm điều này

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

Nhưng đoạn mã trên đang cho tôi lỗi sau

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

Và sau khi điều tra thêm, có vẻ như lỗi là do

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

Và sau khi điều tra sâu hơn, tài liệu cho wp_insert_attachment()các tiểu bang The file MUST be on the uploads directoryliên quan đến$image_file_name

Vì vậy, làm thế nào để tôi tải xuống một hình ảnh và lưu nó vào bài viết của tôi một cách chính xác?

Cảm ơn rất nhiều.


Tôi gặp vấn đề với vấn đề này khi đó là vấn đề về quyền đối với hình ảnh trong thư mục tải lên - chúng cần được sở hữu bởi người dùng máy chủ (ví dụ: dữ liệu www trên apache / linux)
icc97

này chủ đề hỗ trợ WordPress có biết thêm
icc97

Câu trả lời:


11

Gần đây tôi đã phải làm điều này thông qua một kịch bản cron hàng đêm cho một luồng phương tiện truyền thông xã hội. $ Parent_id là ID của bài đăng bạn muốn đính kèm hình ảnh.

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;

}

Ví dụ:

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

1

Bạn không đăng mã được sử dụng để tìm nạp và lưu hình ảnh, vì vậy không thể nói lỗi ở đâu.

Hãy thử mã này để lấy và lưu hình ảnh:

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

Sau đó, chỉ cần sử dụng các hàm này kết hợp với mã của bạn, như vậy:

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

Cũng cần nhớ rằng bạn phải bao gồm wp-admin / gồm / image.php trong mã của bạn để chức năng wp_generate_attachment_metadata()hoạt động, xem Codex

Hy vọng sự giúp đỡ này, nhưng xin lưu ý rằng tất cả các mã ở đây không được kiểm tra.


2
Giải pháp @Jeffrey Barrett là tốt. Là nhiều wordpress hơn của tôi (và chậm hơn một chút, vì API HTTP HTTP làm rất nhiều thứ ). Có thể tốt hơn nếu kiểm tra lỗi khi tải lên trước khi chèn bài đăng đính kèm : if ( $mirror['error'] ) return false; //maybe log error. Ngoài ra, không có kiểm tra nếu nội dung được truy xuất thực sự là một hình ảnh$filetype = wp_check_filetype($filename, NULL ); if ( ! substr_count($filetype['type'], 'image') ) return false;
gmazzap

0

Bạn có thể sử dụng chức năng này để tải lên hình ảnh từ xa để tải lên thư mục và đặt nó làm hình ảnh đặc trưng.

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

Sử dụng:

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

0

Chỉ cần sử dụng chức năng wp (v2.6.0 +) mặc định:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.