Webページからデフォルトのアップロードフォルダーに画像をダウンロードする


8

特定のWebページからアップロードフォルダにプログラムで画像をダウンロードし、それらを投稿の一部として挿入する必要があるカスタムテーマ/プラグインを作成しています。

そのため、プログラムで画像のURLを見つけることができ、それらをwp-contentの下のアップロードフォルダーに保存する必要がありますが、そのフォルダーには、保存された画像用の特定のWordPressフォルダー構造があります。

私の質問は、Webから画像をダウンロードしてアップロードフォルダに保存できるようにするWordPress APIまたは関数またはメソッドはありますか?もしそうなら、それは何ですか。

それ以外の場合、それらの画像を保存するにはどうすればよいですか?

これまでのところ、私はこれをやっています

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

しかし、上記のコードは私に次のエラーを与えています

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

さらに調査した結果、エラーの原因は

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

そして、さらに調査、のドキュメントの後wp_insert_attachment()の状態それThe file MUST be on the uploads directoryに関してで$image_file_name

では、画像をダウンロードして投稿に正しく保存するにはどうすればよいですか?

どうもありがとう。


アップロードディレクトリ内の画像に対する権限の問題であったときに、これに関する問題が発生しました-それらはサーバーユーザーが所有する必要がありました(例:apache / linuxのwww-data)
icc97

回答:


11

私は最近、ソーシャルメディアストリームの毎晩のcronスクリプトを介してこれを行う必要がありました。$ parent_idは、画像を添付する投稿のIDです。

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;

}

例:

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

1

画像の取得と保存に使用するコードを投稿していないため、エラーの場所を特定することはできません。

このコードを取得して画像を保存します。

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

次に、これらの関数をコードと組み合わせて、次のように使用します。

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

あなたがいることも忘れないでくださいしなければならない機能のために、あなたのコード内のwp-adminの/含ん/ image.php含めるようにwp_generate_attachment_metadata()仕事にと、参照コーデックスを

このヘルプを願っていますが、ここにあるすべてのコードはテストされていないことに注意してください。


2
@Jeffrey Barrettのソリューションは優れています。私よりワードプレスです(そしてWP HTTP APIが多くのことをするので少し遅いです)。添付ファイルの投稿を挿入する前に、アップロード時のエラーを確認することをお勧めします:if ( $mirror['error'] ) return false; //maybe log error。また、取得されたコンテンツが実際に画像であるかどうかのチェックも行われません$filetype = wp_check_filetype($filename, NULL ); if ( ! substr_count($filetype['type'], 'image') ) return false;
gmazzap

0

この機能を使用して、画像をリモートアップロードアップロードフォルダーにアップロードし、注目画像として設定できます。

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

使用法:

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

0

デフォルトのwp(v2.6.0 +)関数を使用するだけです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.