私はカスタムテーマ/プラグインを書いています。そこでは特定のウェブページからアップロードフォルダにプログラムで画像をダウンロードし、投稿の一部としてそれらを挿入する必要があります。
だから、私はプログラムで画像のURLを見つけることができました、それから私はそれらをwp-contentの下のuploadフォルダに保存する必要があります、しかしそのフォルダは保存された画像のためにその中に特定のWordPressフォルダ構造を持ちます。
今私の質問は、私がWebから画像をダウンロードしてそれらをuploadsフォルダに保存することを可能にする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
と書かれています。
それでは、どうやって画像をダウンロードして投稿に正しく保存するのですか?
どうもありがとう。
私は最近ソーシャルメディアストリームのために毎晩の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);
画像の取得と保存に使用されたコードを投稿していないので、エラーがどこにあるのかわかりません。
このコードを試して画像を取得して保存します。
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_generate_attachment_metadata()
関数を動作させるためにwp-admin/includes/image.phpをコードにインクルードするにはmustが必要です。 Codex を参照してください。
この手助けを願っていますが、ここのすべてのコードはnotテスト済みであることに注意してください。
デフォルトのwp(v2.6.0 +)関数を使うだけです。
media_sideload_image($ file、$ post_id、$ desc、$ return);
この機能を使用して、画像をアップロードしてフォルダをアップロードし、それを注目画像として設定することができます。
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);